André Laugks: durch Elementenbaum hangeln, Fehler in Netscape 6/7

Hallo!

Ich versuche auf das ID-Attribut im <a>-Tag zuzugreifen.

Mit folgendem Kontrukt kann ich im IE auf die <a>-Tags zugreifen.

--------------------------------------------------------------------
<html>
<head>

<script type="text/javascript">
<!--
function test() {

// -> i die Schleife habe ich mal entfernt

alert(document.getElementById("nav").firstChild.firstChild.childNodes[i].firstChild.firstChild.getAttribute("id"));
}
//-->
</script>
</head>
<body>

<div id="nav">
<table border="1" id="tabelle">
<tr id="td1">
 <td id="td1"><a id="a1">1. Link</a></td>
</tr>
<tr id="tr2">
 <td id="td2"><a id="a2">2. Link</a></td>
</tr>
<tr id="tr3">
 <td id="td3"><a id="a3">3. Link</a></td>
</tr>
</table>
</div>

<a href="javascript:test()">test</a>

</body>
</html>
-------------------------------------------------------------------

Weil es in Netscape 6/7 nicht funktioniert, wollte ich mal der Sache auf den Grund gehen und versuchen, mich mal durch zu hangelt, also mir Kind für Kind ausgeben zu lassen.

Mit "document.getElementById("nav").firstChild.nodeName;" wird mir im IE "TABLE" angezeigt. Im Netscape bekomme ich aber "#text" angezeigt.

Nach lagen rum testen habe ich den Zeilenumbruch nach dem <div> entfernt:

<div id="nav"><table border="1" id="tabelle">

Schwupps liefert mit Netscape 7 "TABLE". Ähhhmmm was ist da los? Als noch die anderen Zeilenumbrüche entfernt habe, konnte ich mich witer durch hangeln und ich bekamm auch keine Fehlermeldungen mehr.

Und warum bekomme ich "TBODY" mit "document.getElementById("nav").firstChild.firstChild.nodeName;" geliefert? Ist das virtuell defaultmäßig vorhanden?

Noch nee Frage, kann man "document.getElementById("nav").firstChild.firstChild.childNodes[i].firstChild.firstChild.getAttribute("id")" kürzer schreiben?

MfG, André Laugks

--
L-Andre @ gmx.de
  1. Hallo!

    Mit "document.getElementById("nav").firstChild.nodeName;" wird mir im IE "TABLE" angezeigt. Im Netscape bekomme ich aber "#text" angezeigt.

    Der Workaround für Netscape 6/7 könnte childNodes[1] sein. Der Zeilenumbruch ist dann ChildNodes[0].

    alert(document.getElementById("nav").childNodes[1].nodeName);

    MfG, André Laugks

    --
    L-Andre @ gmx.de
    1. Hi!

      Der Workaround für Netscape 6/7 könnte childNodes[1] sein. Der Zeilenumbruch ist dann ChildNodes[0].
      alert(document.getElementById("nav").childNodes[1].nodeName);

      Guck mal in den DOM-Inspektor. Da sieht du das der Mozilla bei jedem Zeilenumbruch einen Textnode hinsetzt. Ich würde, damit es in allen DOM-Browsern funktioniert, bei bekannter Elementstruktur lieber auf die von document.getElementById("nav").getElementsByTagName("a") zurückgelieferte Liste zurückgreifen:

      alert(document.getElementById("nav").getElementsByTagName("a")[i].getAttribute("id"))

      oder lt. DOM-2-HTML (nicht getestet):

      alert(document.getElementById("nav").getElementsByTagName("a")[i].id))

      Gruß Herbalizer

      1. Hallo!

        Guck mal in den DOM-Inspektor.

        Den kannte ich noch nicht! Der ist ja richtig cool.

        Das Beispiel von Dir und Thomas funktioniert super.

        Ich habe leider mal wieder gemerkt, daß einiges (auch DOM) an mir vorbei gegangen ist bzw. ich es vorbei gelasen habe :-(. Früher hatte ich viel mehr Bugs und Workaround im Kopf.

        MfG, André Laugks

        --
        L-Andre @ gmx.de
  2. Hallo,

    Noch nee Frage, kann man "document.getElementById("nav").firstChild.firstChild.childNodes[i].firstChild.firstChild.getAttribute("id")" kürzer schreiben?

    Ich rate zu:

    document.getElementById("nav").getElementsByTagName("a")[i].getAttribute("id")

    was auch das Problem mit der Tabelle beseitigt.

    MfG, Thomas