Babelfish: DOM - childNodes - browserspezifisches Verhalten

Hallo,

ich habe Fagen zu dem folgenden Absatz in nodes > childNodes unter:

http://selfhtml.teamone.de/javascript/objekte/node.htm

Zitat:

"Der Netscape 6.1 und der MS Internet Explorer 5.0 Macintosh Edition interpretieren im body-Element und in allen untergeordneten Knoten bereits einen Zeilenumbruch oder ein Leerzeichen im Quelltext zwischen Elementknoten als einen eigenen Kindknoten mit dem Namen #text. Auch HTML-Kommentare bilden eigene Knoten und werden als Knoten mit dem Namen #comment behandelt."

Frage: Ist dieses Verhalten als ein Fehlverhalten der Browser zu werten, oder macht es aus irgend einem Grund Sinn, Leerzeichen und Umbrüche als Knoten zu betrachten ?

Frage: Sind von diesem Phänomen nur diese beiden Browser betroffen ?
Sind die benannten Eigenarten in späteren Versionen ev. bereits behoben worden ?

Frage: Muß ich - auf Grund der geringen Verbreitung dieser beiden Browser auf dieses Phänomen Rücksicht nehmen - wenn ja, in welcher Weise ?

(Abgesehen von der Möglichkeit - wie im Beispiel gezeigt - alles in eine Zeile, also ohne Umbruch und Leerzeichen zu schreiben ?)

Frage: Irgendwer hat mal irgendwo geschrieben, mit dem DOM wird alles einfacher. Wer war das ?!!!?

;-)

Tips, Einschätzungen, Hinweise, alles willkommen

Mit herzlichem Dank

  1. Hallo,

    ich habe Fagen zu dem folgenden Absatz in nodes > childNodes unter:

    http://selfhtml.teamone.de/javascript/objekte/node.htm

    Zitat:

    "Der Netscape 6.1 und der MS Internet Explorer 5.0 Macintosh Edition interpretieren im body-Element und in allen untergeordneten Knoten bereits einen Zeilenumbruch oder ein Leerzeichen im Quelltext zwischen Elementknoten als einen eigenen Kindknoten mit dem Namen #text. Auch HTML-Kommentare bilden eigene Knoten und werden als Knoten mit dem Namen #comment behandelt."

    Ja, macht es.
    Du kannst natürlich auch jederzeit mit getElementById() die Hierarchie umgehen.

    Frage: Ist dieses Verhalten als ein Fehlverhalten der Browser zu werten, oder macht es aus irgend einem Grund Sinn, Leerzeichen und Umbrüche als Knoten zu betrachten ?

    Nein.

    Frage: Sind von diesem Phänomen nur diese beiden Browser betroffen ?

    Nein, Grundsätzlich der Mozilla in all seinen Variaten/Versionen.
    Bei anderen Browsern wie Konqueror, Safari, Opera kann ich es aus dem Stehgreif nicht sagen.

    Sind die benannten Eigenarten in späteren Versionen ev. bereits behoben worden ?

    Warum, ist kein Fehlverhalten.

    Frage: Muß ich - auf Grund der geringen Verbreitung dieser beiden Browser auf dieses Phänomen Rücksicht nehmen - wenn ja, in welcher Weise ?

    Wieso geringe Verbreitung?
    SelfHTML wird zu 25% etwa von Mozilla-Browsern benutz.
    Ich finde alleine den Gedankengang, Browser aus bequemlichkeit auszuschliessen nicht besonders sinnvoll.

    (Abgesehen von der Möglichkeit - wie im Beispiel gezeigt - alles in eine Zeile, also ohne Umbruch und Leerzeichen zu schreiben ?)

    Behebt dein "Problem". oder benutze getElementById()

    Frage: Irgendwer hat mal irgendwo geschrieben, mit dem DOM wird alles einfacher. Wer war das ?!!!?

    Würde ich auch so schreiben.
    Wie würdest du dein Problem ohne DOM (Level 2) lösen?

    gruss
    Thorsten

    1. Hallo,

      Du kannst natürlich auch jederzeit mit getElementById() die Hierarchie umgehen.

      Gilt diese Regel denn nicht auch für alle Knoten, die mit getElementById() ermittelt werden, d.h. die sich in der Hierarchie unterhalb von dem Element "element" befinden ....

      Z.B. die <li>-Elemente unterhalb einer <ul>-Elementes mit der id='element' ?

      <ul id="element">
      <li>Eintrag 1
      <li>Eintrag 2
      <li>Eintrag 3
      </ul>

      Hier ist doch nach jedem Listenpunkt ein Umbruch (oder?)
      Mein Firefox gibt trotz Umbrüchen die korrekte Anzahl (3) von childnodes an ...

      SelfHTML wird zu 25% etwa von Mozilla-Browsern benutz.
      Ich finde alleine den Gedankengang, Browser aus bequemlichkeit auszuschliessen nicht besonders sinnvoll.

      War mir nicht bekannt und geht ja aus dem Absatz in Selfhtml nicht hervor; ist auch nicht unbedingt Bequemlichkeit, sondern eine Frage der Ökonomie.

      Behebt dein "Problem". oder benutze getElementById()

      s.o.

      Wie würdest du dein Problem ohne DOM (Level 2) lösen?

      Uff ....   :-/

      Herzlichen Dank für deine fixe Antwort und schönen S-Abend

      1. Hi,

        Gilt diese Regel denn nicht auch für alle Knoten, die mit getElementById() ermittelt werden, d.h. die sich in der Hierarchie unterhalb von dem Element "element" befinden ....

        Ich meinte das Element selbst greifen kannst du jederzeit mit getElementById(), unabhängig wie die Elemente verschachtelt sind.
        Wenn du natürlich mit getElementById() einsteigst und danach über die  childNodes weiter navigierst, hast du das Problem natürlich wieder.

        Klar, eine brauchbare Lösung kann nicht immer sein, alle elemente mit einer id vergeben.

        Z.B. die <li>-Elemente unterhalb einer <ul>-Elementes mit der id='element' ?

        <ul id="element">
        <li>Eintrag 1
        <li>Eintrag 2
        <li>Eintrag 3
        </ul>

        hab' ich gerade mal getestet, Firebird liefert mir hier 4. Wenn ich die Endtags (</li>) setze 7. FireFox habe ich hier leider nicht drauf.

        Hier ist doch nach jedem Listenpunkt ein Umbruch (oder?)
        Mein Firefox gibt trotz Umbrüchen die korrekte Anzahl (3) von childnodes an ...

        Scheint er wegen der fehlenden Endtags nicht so aufzufassen. Probier einfach mal das mit den entsp. Endtags.

        SelfHTML wird zu 25% etwa von Mozilla-Browsern benutz.
        Ich finde alleine den Gedankengang, Browser aus bequemlichkeit auszuschliessen nicht besonders sinnvoll.

        http://aktuell.de.selfhtml.org/sonst/userwatch.shtml

        War mir nicht bekannt und geht ja aus dem Absatz in Selfhtml nicht hervor; ist auch nicht unbedingt Bequemlichkeit, sondern eine Frage der Ökonomie.

        Ansichtssache ;)
        Für mich Bequemlichkeit, da 1.) AFAIK es nicht definiert ist ob dieser Zeilenumbruch nun im Sinne von DOM ein childNode darstellen so oder nicht, 2.) du 1. ausser Acht lässt und die "einfachere" Variation als Lösungsgrundlage verwendest und dafür auch Browser bewusst ausschliesst, ohne vielleicht tatsächliches zu wissen wieviele du nun damit bewusst ausschliesst.

        DOM bietet genügned Möglichkeiten, es liegt nur daran wie effektiv man diese einsetzt. D.h. nicht, dass eine Navigation mit childNodes immer am sinnvollsten ist.
        Willst du z.b. das allererste Element ansprechen, egal welches ist firstChild eine gute Wahl.
        Willst du gezielt ein Element, unabhängig wo es sich befindet ansprechen, ist firstChild wiederrum vielleicht die falsche Wahl, weil sich die Position vielleicht ändern mag, da wäre getElementById() dein Freund :)

        <ul id="element">
        <li>Eintrag 1
        <li>Eintrag 2
        <li>Eintrag 3
        </ul>

        mit
        document.getElementById("element").getElementsByTagName("LI")
        z.b., liefert dir DOM hervorragend nur die einzelnen Listenelemente, völlig egal ob nun Zeilenumbrüche oder nicht.

        gruss
        Thorsten

      2. Hallo!

        Z.B. die <li>-Elemente unterhalb einer <ul>-Elementes mit der id='element' ?

        <ul id="element">
        <li>Eintrag 1
        <li>Eintrag 2
        <li>Eintrag 3
        </ul>

        besser so:

        <ul id="element">
          <li>Eintrag 1</li>
          <li>Eintrag 2</li>
          <li>Eintrag 3</li>
        </ul>

        Man arbeitet am besten mit getElementsByTagName().

        Folgendes würde Dir bei Deinem Beispiel "3" zurück liefern:

        document.getElementById('element').getElementsByTagName('li').length;

        Mit

        liste = document.getElementById('element')getElementsByTagName('li');
        for(i = 0; i < liste.length; i++)
          {
            alert(liste[i].firstChild.nodeValue);
          }

        würdest Du den Textknoten jedes li's ausgegeben bekommen.

        Hier ist doch nach jedem Listenpunkt ein Umbruch (oder?)
        Mein Firefox gibt trotz Umbrüchen die korrekte Anzahl (3) von childnodes an ...

        Weil vielleicht Dein HTML falsch war?! Das gibt es ja keine schließenden li's. Deshalb wird der Mozilla auch keine Textknoten für jeden Listeneintrag generiert haben.

        MfG, André Laugks

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

    Frage: Ist dieses Verhalten als ein Fehlverhalten der Browser zu werten, oder macht es aus irgend einem Grund Sinn, Leerzeichen und Umbrüche als Knoten zu betrachten ?

    Der IE entfernt sie für Dich. IMHP ist das vom W3C so vorgeschrieben.

    Frage: Irgendwer hat mal irgendwo geschrieben, mit dem DOM wird alles einfacher. Wer war das ?!!!?

    Das stimmt!

    MfG, André Laugks

    --
    L-Andre @ gmx.de
  3. Dank Euch Beiden,

    habe nun ausreichend Anhaltspunkte und weiss, dass eine Navigation über childNodes - wegen der unterschiedlichen Handhabung in den einzelnen Browsern - kompliziert und fehleranfällig(er) ist als folgende Lösung:

    ebene = document.getElementById('liste');
    tags = ebene.getElementsByTagName('li');

    Als ich geschrieben hab, mein Firefox gibt die Anzahl der Unterknoten von "liste" korrekt mit 3 an, habe ich übrigens auch mit
    getElementsByTagName() gearbeitet. Diese Methode, Knoten anzusprechen, scheint also "Idiotensicher" zu sein.

    Inwieweit ein Umbruch im Quelltext ein Knoten sein muß, ist mir immer noch nicht klar, den ein so erzeugter Umbruch ist ja - nach meinem Verständnis der Materie - keine bewußte Entscheidung:"hier soll ein Umbruch sein"; einen Umbruch erzeuge ich mit <p> <br> oder mit einem Blockelement.

    Warum also auf Umbruch-Knoten mit childNodes zugreifen, es sei denn, um sie zu entfernen ....

    Mfg Babelfish