flaffy: IE und Mozilla verhalten sich unterschiedlich bei DOM-Knoten?

Huhu

Ich würde gerne über DOM ein paar Elemente in einer Schleife parsen. Soweit sogut...aber Internet Explorer und Mozilla unterscheiden sich in der Interpretation der DOM Liste.

Bestes Beispiel aus Selfhtml an sich:
http://de.selfhtml.org/javascript/objekte/anzeige/node_next_sibling.htm

Mozilla (1.5.0.4) Ausgabe:

erster Punkt
zweiter Punkt

Das ul-Element hat folgende Knoten unter sich:
Einen Knoten mit dem Namen #text
Einen Knoten mit dem Namen LI
Einen Knoten mit dem Namen #text
Einen Knoten mit dem Namen LI
Einen Knoten mit dem Namen #text

zurück

Internet Explorer (6):

erster Punkt
zweiter Punkt
Das ul-Element hat folgende Knoten unter sich:
Einen Knoten mit dem Namen LI
Einen Knoten mit dem Namen LI

zurück

Das Problem sind die #text-Blöcke "zwischen" den einzelnen Nodes. Das ist jetzt nicht nur bei dem Beispiel so sondern generell. Kann mir das jemand erklären? Bzw. wie ich diese Elemente vermeiden kann?

Mein erster Lösungsgedanke war, einfach per nodeType zu filtern. Was dann zu meinem nächsten Problem führte: hasChildNodes() bezieht sich u.a. im Mozilla auf ein #text Element. d.h. jedes Elemente - ob es nun children hat oder nicht - hat childs.

Hat das Problem sonst noch jemand?

  1. Hallo flaffy.

    Das Problem sind die #text-Blöcke "zwischen" den einzelnen Nodes. Das ist jetzt nicht nur bei dem Beispiel so sondern generell. Kann mir das jemand erklären? Bzw. wie ich diese Elemente vermeiden kann?

    Gar nicht, da es dem Client überlassen ist, ob er Whitespaces (Leerzeichen, Tabs und Zeilenumbrüche) als Textknoten ansieht, oder nicht.

    Das gesamte Dokument ohne jegliche Quelltextformatierung zu schreiben ist keine gute Alternative.

    Mein erster Lösungsgedanke war, einfach per nodeType zu filtern. Was dann zu meinem nächsten Problem führte: hasChildNodes() bezieht sich u.a. im Mozilla auf ein #text Element. d.h. jedes Elemente - ob es nun children hat oder nicht - hat childs.

    Warum so kompliziert? Warum nicht so:

    document.getElementsByTagName('ul')[0].getElementsByTagName('li')[0];

    Damit greifst du auf das erste Listenelement in der ersten ungeordneten Liste im Dokument zu. Um Textknoten musst du dich hierbei nicht kümmern, da du ja zwangsläufig nur auf Elementknoten zugreifst.

    Einen schönen Dienstag noch.

    Gruß, Ashura

    --
    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]
    1. Warum so kompliziert? Warum nicht so:

      Das war nur ein Beispiel. Mein eigentlicher Gedankengang war eine Funktion zu schreiben die mir ein gesamtes XmlDocument in ein Objekt umwandelt.

      So dass ich dann im Endeffekt so auf meine Werte zugreifen kann:
      o[ "level1" ][ "level2" ][ "wert" ]

      1. Hallo flaffy.

        Mein eigentlicher Gedankengang war eine Funktion zu schreiben die mir ein gesamtes XmlDocument in ein Objekt umwandelt.

        So dass ich dann im Endeffekt so auf meine Werte zugreifen kann:
        o[ "level1" ][ "level2" ][ "wert" ]

        Und inwiefern schließt dies den Weg über getElementsByTagName aus?

        Einen schönen Dienstag noch.

        Gruß, Ashura

        --
        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]
        1. Und inwiefern schließt dies den Weg über getElementsByTagName aus?

          Dass sie erstmal ein ein new Object() als Variablen stehen sollen :)

          1. Hallo flaffy.

            Und inwiefern schließt dies den Weg über getElementsByTagName aus?

            Dass sie erstmal ein ein new Object() als Variablen stehen sollen :)

            Ich sehe noch immer kein Problem.

            Einen schönen Dienstag noch.

            Gruß, Ashura

            --
            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]
  2. Hallo Flaffy

    Bzw. wie ich diese Elemente vermeiden kann?

    Indem du deinen Code in einen Bandwurm umschreibst:

    <html><head><title>Titel</title><body>...

    Aber das wirst du wohl kaum wollen. Die Textelemente sind wirklich die Zeilenumbrüche und Tabulatoren/Leerzeichen zwischen den Tags - und das ist auch gut so. Das gesammte Text-Dokument wird in eine Baumstruktur umgewandelt.

    Mein erster Lösungsgedanke war, einfach per nodeType zu filtern.

    Das ist IMHO der richtige Lösungsansatz. Am besten schreibst du dir selbst eine hasChildElements()-Funktion, welche text-Knoten ignoriert.

    Was dann zu meinem nächsten Problem führte: hasChildNodes() bezieht sich u.a. im Mozilla auf ein #text Element. d.h. jedes Elemente - ob es nun children hat oder nicht - hat childs.

    *g* Für dich scheinen nur Element-Knoten würdige Kind-Knoten zu sein? Das finde ich jetzt fast ein bisschen diskriminierend ;-).

    Gruss

    Tom2

    1. Indem du deinen Code in einen Bandwurm umschreibst:

      Ich habe leider keinen Zugriff auf die generierten Daten auf die ich zugreifen möchte.

      *g* Für dich scheinen nur Element-Knoten würdige Kind-Knoten zu sein? Das finde ich jetzt fast ein bisschen diskriminierend ;-).

      Der Internet Explorer steht hinter mir :)

      1. hi,

        Der Internet Explorer steht hinter mir :)

        In so einem Falle lauten die einzigen beiden vertretbaren Ratschläge:

        Lauf so schnell du kannst, oder
        Dreh dich um, und kämpfe.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }