Benjamin: [Safari]Javascript: HTML-Objekt durch "name"-Attribut ansprechen

Hallo ihrs.

Ich hab da also folgende Tabelle:

<table id="Chat">
 <tr>
  <td name="beitrag1"></td>
 </tr>
 <tr>
  <td name="beitrag2"></td>
 </tr>
</table>

Wenn ich jetzt beispielsweise auf die zweite Zelle zugreifen möchte gehe ich wie folgt vor:

document.getElementById("Chat").getElementsByTagName("td").beitrag2

Das funktioniert im IE sowie im FF einwandfrei. Lediglich der Safari macht Probleme. Kann es sein, dass es mit dem Safari nicht möglich ist per "name"-Attribut von HTML-Objekten auf eben diese HTML-Objelte zuzugreifen?

Würde mich über eine Antwort freuen und bedanke mich schonmal im Vorraus.

mfg
benjamin

  1. Hi,

    <td name="beitrag2"></td>

    Wenn ich jetzt beispielsweise auf die zweite Zelle zugreifen möchte gehe ich wie folgt vor:

    document.getElementById("Chat").getElementsByTagName("td").beitrag2

    Das funktioniert im IE sowie im FF einwandfrei.

    Schoener Zufall.

    Lediglich der Safari macht Probleme. Kann es sein, dass es mit dem Safari nicht möglich ist per "name"-Attribut von HTML-Objekten auf eben diese HTML-Objelte zuzugreifen?

    Doch - bei Elementen, fuer die in HTML ein name-Attribut definiert ist. Nein, Tabellenzellen gehoeren nicht zu diesen.

    MfG ChrisB

    --
    "The Internet: Technological marvel of marvels - but if you don't know *what* you're lookin' for on the Internet, it is nothing but a time-sucking vortex from hell."
    1. Hi,

      <td name="beitrag2"></td>

      Wenn ich jetzt beispielsweise auf die zweite Zelle zugreifen möchte gehe ich wie folgt vor:

      document.getElementById("Chat").getElementsByTagName("td").beitrag2

      Das funktioniert im IE sowie im FF einwandfrei.

      Schoener Zufall.

      Lediglich der Safari macht Probleme. Kann es sein, dass es mit dem Safari nicht möglich ist per "name"-Attribut von HTML-Objekten auf eben diese HTML-Objelte zuzugreifen?

      Doch - bei Elementen, fuer die in HTML ein name-Attribut definiert ist. Nein, Tabellenzellen gehoeren nicht zu diesen.

      MfG ChrisB

      Vielen Dank, das hilft mir weiter. ;)

  2. Wenn ich jetzt beispielsweise auf die zweite Zelle zugreifen möchte gehe ich wie folgt vor:

    document.getElementById("Chat").getElementsByTagName("td").beitrag2

    Ich bin erschüttert, das geht wirklich, aber warum???

    Struppi.

    1. Yerf!

      Ich bin erschüttert, das geht wirklich, aber warum???

      Vermutlich weil sich JavaScript nicht um irgendwelche HTML-Regeln kümmert...

      Gruß,

      Harlequin

      --
      <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
    2. Hallo,

      Ich bin erschüttert, das geht wirklich, aber warum???

      getElementsByTagName gibt im Firefox eine HTMLCollection. Das ist nicht ganz DOM-Core-konform, demgemäß müsste es eine NodeList sein.

      HTMLCollections haben jedenfalls die Methode namedIndex.

      nodelist["str"] ist im ECMAScript-Binding von DOM Core auf nodelist.namedIndex("str") gelegt.

      nodeIndex sucht erst nach Elementen mit einem entsprechenden id-Attribut, dann nach Elementen mit entsprechendem name-Attribut.

      Aus DOM-Sicht geht .getElementsByTagName("td").beitrag2 aus demselben Grund wie document.forms.bla bzw. document.forms.bla.elements.bla mit name-Attributen funktioniert, weil forms und elements auch HTMLCollections sind.

      Mathias

      1. Aus DOM-Sicht geht .getElementsByTagName("td").beitrag2 aus demselben Grund wie document.forms.bla bzw. document.forms.bla.elements.bla mit name-Attributen funktioniert, weil forms und elements auch HTMLCollections sind.

        OK, die Erklärung leuchtet ein, aber ist alles andere als logisch, weil nämlich umgekehrt:

        var x = document.getElementById("Chat").getElementsByTagName("td").beitrag1;  
        alert(x.name);
        

        Der Name gar nicht existiert und wenn ich das hier richtig verstehe:

        namedItem

        This method retrieves a Node using a name. With [HTML 4.01] documents, it first searches for a Node with a matching id attribute. If it doesn't find one, it then searches for a Node with a matching name attribute, but only on those elements that are allowed a name attribute. With [XHTML 1.0] documents, this method only searches for Nodes with a matching id attribute. ...

        dann dürfte es auch nicht funktionieren.

        Struppi.

        1. Hallo,

          alert(x.name);

          alert(x.getAttribute("name"));

          ;-P

          it then searches for a Node with a matching name attribute, but only on those elements that are allowed a name attribute

          Oh, ja, das wird natürlich auch ignoriert...

          Mathias

  3. Hallo,

    Das funktioniert im IE sowie im FF einwandfrei.

    Das ist in gleich zweifacher Hinsicht nicht standardkonform:

    getElementsByTagName gibt gemäß W3C DOM Core eine NodeList zurück, in diesen Browsern ist es aber eine HTMLCollection (siehe mein anderes Posting). Der Unterschied ist, dass eine Ansprechweise über id- bzw. name-Attribut wie diese bei NodeLists eigentlich nicht möglich ist.

    Dann gibt es wie gesagt gar keine name-Attribute bei td-Elementen. Die könntest du natürlich durch id-Attribute ersetzen, wodurch der HTML-Code standardkonform wäre. Aber das würde nicht ändern, dass getElementsByTagName("td").beitrag2 hochgradig proprietär ist und es daher nicht alle Browser können.

    Überhaupt verstehe ich das Problem nicht ganz. Wozu brauchst du die Nummerierung beitrag1, beitrag2 usw.? Du kannst auf die td-Elemente auch anders zugreifen:

    var table = document.getElementById("Chat");  
    table.rows[0].cells[0] // erste Zeile, erste Zelle  
    table.rows[1].cells[0] // zweite Zeile, erste Zelle  
    // usw.
    

    Mathias