nimble: Einen Link definieren

Hi

Ich wollte einen Link kreieren:

  
current_link = document.createElement("a");  
    current_link.text = line.childNodes[i].text;  
    current_link.href = line.childNodes[i].getAttribute("link"));  
    mycurrent_cell.appendChild(current_link);  

nun funktioniert das so im IE nicht...
wie kann ich die eigenschaften des links definieren, damit der IE das versteht (setAttribute('href', 'www.xy') versteht dieser ja bekanntlich nicht.

THX

--
ie:} fl:( br:> va:) ls:& fo:# rl:( n4:? ss:) de:] js:| ch:? sh:) mo:? zu:)
------------------------------
lieber ein Pinguin der läuft
als ein Fenster das hängt
------------------------------
  1. Hallo nimble.

    Ich wollte einen Link kreieren:

    current_link = document.createElement("a");
        current_link.text = line.childNodes[i].text;
        current_link.href = line.childNodes[i].getAttribute("link"));
        mycurrent_cell.appendChild(current_link);

    
    >   
    > nun funktioniert das so im IE nicht...  
    > wie kann ich die eigenschaften des links definieren, damit der IE das versteht (setAttribute('href', 'www.xy') versteht dieser ja bekanntlich nicht.  
      
    Da du uns das zugehörige HTML vorenthältst, kann man dir nur zum Debuggin raten. Arbeite folgende Schritte ab:  
      
    1\.) Kommentiere alles ab „current\_link.href …“ bis zum Ende dieses Codeschnipsels aus und lasse dir line.childNodes[i].text ausgeben. Stimmt das, was ausgegeben wird, mit dem überein, was du erwartet hast? Wenn nein, gehe zu 2.  
      
    2\.) Kommentiere nun lediglich die letzte Zeile deines Codeschnipsels aus und lasse dir line.childNodes[i].getAttribute("link")) (btw.: eine schließende Klammer zu viel) ausgeben. Reaktion und folgende Aktion sind unter 1. nachzulesen.  
      
    Das Spielchen treibst du so lange, bis du etwas erhältst, was du nicht erwartet hast.  
      
      
    Einen schönen Samstag noch.  
      
    Gruß, Mathias  
    
    -- 
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|  
    „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“  
    [[HTML Design Constraints: Logical Markup](http://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/HTMLConstraints.html)]
    
    1. Hi

      Da du uns das zugehörige HTML vorenthältst, kann man dir nur zum Debuggin raten. Arbeite folgende Schritte ab:

      fehlen tun nur noch einige append Befehle und ein div mit einer ID wo das ganze dann eingehängt wird...

      1.) Kommentiere alles ab „current_link.href …“ bis zum Ende dieses Codeschnipsels aus und lasse dir line.childNodes[i].text ausgeben. Stimmt das, was ausgegeben wird, mit dem überein, was du erwartet hast?

      ich habe alles auskommentiert und stattdessen

        
      current_link = document.createTextNode(line.childNodes[i].text);  
      
      

      eingefügt - das hat auch wunderbar geklappt.

      Der Fehler muss also auf den drei Zeilen

        
      current_link = document.createElement("a");  
      current_link.text = line.childNodes[i].text;  
      current_link.href = line.childNodes[i].getAttribute("link");  
      
      

      liegen.
      ich habe .text und .href mit alert ausgegeben, da steht wass stehen soll. nur bei der ausgabe alert(current_link); blieb die Anzeige leer.

      2.) Kommentiere nun lediglich die letzte Zeile deines Codeschnipsels aus und lasse dir line.childNodes[i].getAttribute("link")) (btw.: eine schließende Klammer zu viel) ausgeben. Reaktion und folgende Aktion sind unter 1. nachzulesen.

      Wie du siehst ist die Klammer nur ein überbleibsel einer meiner versuche zu Debuggen - die wird übrigens direkt als Fehlermeldung angegeben - ich habe jedoch keine Fehlermeldung, aber auch keinen Link

      THX

      --
      ie:} fl:( br:> va:) ls:& fo:# rl:( n4:? ss:) de:] js:| ch:? sh:) mo:? zu:)
      ------------------------------
      lieber ein Pinguin der läuft
      als ein Fenster das hängt
      ------------------------------
      1. Hallo nimble.

        Der Fehler muss also auf den drei Zeilen

        current_link = document.createElement("a");
        current_link.text = line.childNodes[i].text;
        current_link.href = line.childNodes[i].getAttribute("link");

        
        > liegen.  
        > ich habe .text und .href mit alert ausgegeben, da steht wass stehen soll. nur bei der ausgabe alert(current\_link); blieb die Anzeige leer.  
          
        Und was passiert bei alert(line.childNodes[i].link)?  
          
          
        Einen schönen Samstag noch.  
          
        Gruß, Mathias  
        
        -- 
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|  
        „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“  
        [[HTML Design Constraints: Logical Markup](http://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/HTMLConstraints.html)]
        
        1. Hi

          Und was passiert bei alert(line.childNodes[i].link)?

            
          alert(current_link.text); => Weitere info  
          alert(curret_link.href); => http://www.nimble.ch  
          
          

          THX

          --
          ie:} fl:( br:> va:) ls:& fo:# rl:( n4:? ss:) de:] js:| ch:? sh:) mo:? zu:)
          ------------------------------
          lieber ein Pinguin der läuft
          als ein Fenster das hängt
          ------------------------------
  2. Hallo,

    Ich wollte einen Link kreieren:

    current_link = document.createElement("a");
        current_link.text = line.childNodes[i].text;

    ^Woher hast Du die Information, dass es [link:http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-48250443@title=HTMLAnchorElement].text gibt?

    current_link.href = line.childNodes[i].getAttribute("link"));
        mycurrent_cell.appendChild(current_link);

    
    >   
      
    ~~~javascript
      
    current_link = document.createElement("a");  
    current_link.appendChild(document.createTextNode(line.childNodes[i].text));  
    current_link.href = line.childNodes[i].getAttribute("link");  
    mycurrent_cell.appendChild(current_link);  
    
    

    viele Grüße

    Axel

    1. Hallo Axel,

      current_link.href = line.childNodes[i].getAttribute("link");
      mycurrent_cell.appendChild(current_link);

        
        
      Fehlt da nicht vorher auch noch  
      ~~~javascript
        
      myHref  = [link:http://de.selfhtml.org/javascript/objekte/document.htm#create_attribute@title=document.createAttribute('href')];  
      myHref.nodeValue = "http://www.nimble.ch";  
      current_link.setAttributeNode(myHref);  
        
      
      ~~~?  
      Gruß Gernot
      
      1. Hallo,

        Fehlt da nicht vorher auch noch

        myHref  = [link:http://de.selfhtml.org/javascript/objekte/document.htm#create_attribute@title=document.createAttribute('href')];
        myHref.nodeValue = "http://www.nimble.ch";
        current_link.setAttributeNode(myHref);

          
        Nein, das Attribut href bringen [HTMLAnchorElement](http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-48250443)e von sich aus mit.  
          
          
        viele Grüße  
          
        Axel
        
        1. Hallo Axel,

          Nein, das Attribut href bringen HTMLAnchorElemente von sich aus mit.

          Daran scheinen sich die diversen Browser aber nicht zu halten:

            
          <a name="meineSprungmarke">Hallo</a>  
          
          

          wird nicht mit der defaultmäßig üblichen Unterstreichung und der Hand beim Drüberfahren als Link ausgezeichnet, und das ist ja wohl auch gut so.

          Bei Firefox 1.5.0.6  reicht schon das Setzen des href-Attributs ohne Wertzuweisung, um dieses Erscheinungsbild hervorzurufen.

            
          <a href >Hallo</a>  
          
          

          Bei IE 6 und Opera 9 bedarf es dazu dann doch sogar auch noch der Zuweisung eines Wertes, und sei es auch nur eine leere Zeichenkette.

            
          <a href="" >Hallo</a>  
          
          

          Gruß Gernot

          1. Hallo,

            Nein, das Attribut href bringen HTMLAnchorElemente von sich aus mit.

            Daran scheinen sich die diversen Browser aber nicht zu halten:

            doch ;-)

            <a name="meineSprungmarke">Hallo</a>

            
            > wird nicht mit der defaultmäßig üblichen Unterstreichung und der Hand beim Drüberfahren als Link ausgezeichnet, und das ist ja wohl auch gut so.  
            
            Ja, weil das Attribut href keinen Inhalt hat.  
              
            Vergleiche die Ausgaben in  
              
            <a name="meineSprungmarke" onclick="alert(this.href);alert(this.blah);">Hallo</a>  
              
            this.href = [leer]  
            this.blah = undefined  
              
            
            > Bei Firefox 1.5.0.6  reicht schon das Setzen des href-Attributs ohne Wertzuweisung, um dieses Erscheinungsbild hervorzurufen.  
            > ~~~html
              
            
            > <a href >Hallo</a>  
            > 
            
            

            Offensichtlich setzt er dann href="". Das ist nicht korrekt, allerdings ist auch die Notation <a href >Hallo</a> nicht korrekt, so dass man nicht von einem FF Bug sprechen kann.

            Bei IE 6 und Opera 9 bedarf es dazu dann doch sogar auch noch der Zuweisung eines Wertes, und sei es auch nur eine leere Zeichenkette.

            <a href="" >Hallo</a>

            Richtig. Aber was hat das damit zu tun, ob die Eigenschaft href standardmäßig für A-Elemente vorhanden ist. Vorhanden sein heißt doch nicht automatisch auch einen Inhalt haben. HTMLAnchorElemente haben per default die Eigenschaft href. Sie muss deshab nicht mit createAttribute usw. erzeugt werden, sondern ihr kann sofort mit [HTMLAnchorElement].href=[DOMString] ein Wert zugewiesen werden.  
              
            So kannst Du austesten, welche Eigenschaften ein Element per default hat:  
              
            ~~~javascript
              
            var myA = document.createElement("A");  
            for (e in myA) document.write(e + "<br>");  
            
            

            viele Grüße

            Axel

            1. Hi

              Ich versuch jetzt mal die Kommentare aus verschiedenen Antwortern zusammenzuschneiden und meine Antwort darauf zu geben:

              Gernot Back »» Haben A-Elemente denn ein Attribut namens "link"?
              Du hast in die Falsche Richtung gelesen:
              current_link.href = line.childNodes[i].getAttribute("link"));
              gesetzt wird das Attribut .href des Links, welches aus diesem XML gelesen wird:
              <additional link="http://www.nimble.ch">Ansehen</additional>

              Axel Richter »» current_link.text = line.childNodes[i].text;

              ^Woher hast Du die Information, dass es HTMLAnchorElement.text gibt?

              Ja das ist ne ganz Komische Informationsquelle ;-)

              Die gesetzten Werte .text und .href können danach auch problemlos ausgegeben werden, also scheint die zuweisung geklappt zu haben...

              var myA = document.createElement("A");
              for (e in myA) document.write(e + "<br>");

              Das muss ich mir merken!

              THX

              --
              ie:} fl:( br:> va:) ls:& fo:# rl:( n4:? ss:) de:] js:| ch:? sh:) mo:? zu:)
              ------------------------------
              lieber ein Pinguin der läuft
              als ein Fenster das hängt
              ------------------------------
              1. Hallo,

                Axel Richter »» current_link.text = line.childNodes[i].text;

                ^Woher hast Du die Information, dass es HTMLAnchorElement.text gibt?
                Ja das ist ne ganz Komische Informationsquelle ;-)

                *g* Da steht aber in den Browsersymbolen auch zwischen den Zeilen, dass der IE das nicht kann ;-). Außerdem steht dort, dass nur lesender Zugriff möglich ist.

                Hast Du es denn mal mit der Variante aus https://forum.selfhtml.org/?t=134621&m=873367 versucht?

                viele Grüße

                Axel

                1. Hi»» Hallo,

                  Axel Richter »» current_link.text = line.childNodes[i].text;

                  ^Woher hast Du die Information, dass es HTMLAnchorElement.text gibt?
                  Ja das ist ne ganz Komische Informationsquelle ;-)
                  *g* Da steht aber in den Browsersymbolen auch zwischen den Zeilen, dass der IE das nicht kann ;-). Außerdem steht dort, dass nur lesender Zugriff möglich ist.

                  *blush* s war wohl schon zu spät, als das ich das zwischen den zeilen auch noch kappiert hätte...

                  Hast Du es denn mal mit der Variante aus https://forum.selfhtml.org/?t=134621&m=873367 versucht?

                  Das war mein erster schritt heute morgen (gleich nach dem Beantworten ;-)) des Threads... und es FUNKTIONIERT :-)

                  THX @ all

                  --
                  ie:} fl:( br:> va:) ls:& fo:# rl:( n4:? ss:) de:] js:| ch:? sh:) mo:? zu:)
                  ------------------------------
                  lieber ein Pinguin der läuft
                  als ein Fenster das hängt
                  ------------------------------
            2. Hallo Axel,

              Vergleiche die Ausgaben in

              <a name="meineSprungmarke" onclick="alert(this.href);alert(this.blah);">Hallo</a>

              this.href = [leer]
              this.blah = undefined

              HTMLAnchorElemente haben per default die Eigenschaft href. Sie muss deshab nicht mit createAttribute usw. erzeugt werden, sondern ihr kann sofort mit [HTMLAnchorElement].href=[DOMString] ein Wert zugewiesen werden.

              Danke, da habe ich was gelernt. Allerdings scheint die Methode, eine wenn auch bereits vorhandenen Eigenschaft neu anzulegen und ihr dann mit setAttributeNode() einen Wert zuzuweisen auch im IE einwandfrei zu funktionieren.

              Auch die Methode setAttribute() des Node-Objekts ist, wie ich gerade getestet habe, eigentlich unproblematisch und möglicherweise hat es ja doch auch gar nichts mit der Frage zu tun, ob das Attribut per Default existiert oder nicht.

              Da steht ja in der DOKU nur in Bezug auf die Schreibweise gewisser Attribute wie useMap und readOnly:

              "Wenn Sie diese Attribute mit setAttribute() setzen möchten, müssen Sie die angegebene Schreibweise verwenden, damit der Internet Explorer korrekt arbeitet. Allerdings akzeptieren andere Browser diese speziellen Schreibweisen nicht. Deshalb ist es einfacher, den Internet-Explorer-Fehler zu umgehen, indem Sie auf setAttribute() möglichst verzichten und den Direktzugriff nutzen."

              Wenn man der Methode aber einen unsinnigen dritten Übergabeparameter, wie eine leere Zeichenkette mitgibt, dann ignorieren das gescheite Browser und auch beim IE ist dann die Groß- oder Kleinschreibung der Eigenschaft irrelevant. Man braucht sich darüber dann also auch keinen Kopf mehr zu machen.

                
              window.onload = function appendInput() {  
               var myInput = document.createElement("input");  
               myInput.setAttribute("rEaDoNlY", true, "");  
               //myInput.readOnly = true;  
               //myInput.readonly = true;  
               document.body.appendChild(myInput);  
              }  
              
              

              Ich habe es bisher unter Windows XP getestet in IE 6, Opera 9, und FF 1. Wie es unter anderen Betriebssystemen aussieht, wäre spannend zu erfahren.

              Gruß Gernot

              1. Hallo nochmal,

                Wenn man der Methode aber einen unsinnigen dritten Übergabeparameter, wie eine leere Zeichenkette mitgibt,

                window.onload = function appendInput() {
                var myInput = document.createElement("input");
                myInput.setAttribute("rEaDoNlY", true, "");
                //myInput.readOnly = true;
                //myInput.readonly = true;
                document.body.appendChild(myInput);
                }

                  
                Ich habe mir das gerade noch einmal durch den Kopf gehen lassen; so unsinnig ist der Übergabeparameter für den IE wahrscheinlich nicht, allerdings wäre statt der leeren Zeichenkette eine 0 oder ein false sinniger: Intern arbeitet der IE hier wohl mit seiner [gleichnamigen Methode des All-Objekts](http://de.selfhtml.org/javascript/objekte/all.htm#set_attribute), bei der der dritte Parameter für die Case-Sensitivity zuständig ist.  
                  
                Gruß Gernot
                
                1. Hallo,

                  Ich habe mir das gerade noch einmal durch den Kopf gehen lassen; so unsinnig ist der Übergabeparameter für den IE wahrscheinlich nicht, allerdings wäre statt der leeren Zeichenkette eine 0 oder ein false sinniger: Intern arbeitet der IE hier wohl mit seiner gleichnamigen Methode des All-Objekts, bei der der dritte Parameter für die Case-Sensitivity zuständig ist.

                  Jepp!

                  Das Ganze funktioniert auch mit Konqueror (3.3.2) und Mozilla unter Linux.

                  Allerdings sehe ich den Sinn nicht ganz ein. Bei

                  myInput.setAttribute("style", "background:#0F0;", 0);
                   myInput.setAttribute("onblur", "alert('Hallo')", 0);

                  ist die IE-Unterstützung schon wieder nicht mehr gegeben. Die andere Notation:

                  myInput.readOnly = true;
                   myInput.value = "Test";
                   myInput.style.background = "#0F0";
                   myInput.onblur = function(){alert('Hallo')};

                  funktioniert ohne Browserweiche überall. Man muss halt nachsehen, was groß und was klein geschrieben werden muss.

                  viele Grüße

                  Axel

  3. Hallo nimble,

    current_link = document.createElement("a");
        current_link.text = line.childNodes[i].text;
        current_link.href = line.childNodes[i].getAttribute("link"));
        mycurrent_cell.appendChild(current_link);

      
    
    > nun funktioniert das so im IE nicht...  
      
    Es würde mich wundern, wenn das in irgendeinem Browser funktionierte.  
      
    Haben A-Elemente denn ein Attribut namens "link"?  
      
    
    > wie kann ich die eigenschaften des links definieren, damit der IE das versteht (setAttribute('href', 'www.xy') versteht dieser ja bekanntlich nicht.  
      
    Genau habe ich das auch erst vor kuzem von [Wahsaga](http://forum.de.selfhtml.org/archiv/2006/7/t133688/#m866924) genau gelernt.  
      
    "Der IE mag setAttribute nicht, wenn ein Element ein Attribut "per Default" schon besitzt."  
      
    Das Attribut, das du ebenfalls erst [kreieren](http://de.selfhtml.org/javascript/objekte/node.htm#set_attribute_node) musst, weil A-Elemente es per Default eben nicht besitzen, heißt "href".  
      
    Gruß Gernot
    
    1. Hi,

      current_link.href = line.childNodes[i].getAttribute("link"));
      Es würde mich wundern, wenn das in irgendeinem Browser funktionierte.
      Haben A-Elemente denn ein Attribut namens "link"?

      Woher willst Du wissen, ob line ein a-Element ist?

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      O o ostern ...
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. Hallo Andeas,

        Woher willst Du wissen, ob line ein a-Element ist?

        Ja, mein Fehler:

        https://forum.selfhtml.org/?t=134621&m=873393

        Gruß Gernot