IE und Mozilla verhalten sich unterschiedlich bei DOM-Knoten?
flaffy
- javascript
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
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
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?
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
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" ]
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
Und inwiefern schließt dies den Weg über getElementsByTagName aus?
Dass sie erstmal ein ein new Object() als Variablen stehen sollen :)
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
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
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 :)
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