Volker Nebelung: Typ des Vorgängerknoten bestimmen

Aloha 'oe,

ich habe in meinem HTML-Dokument folgende DOM-Struktur:
TABLE
  TR
    TD
      #text
      A
        #text
      #text   <-- *
      A
        #text
    TD
      #text

Ich will nun ermitteln, ob es zu einem Textknoten #text auf derselben Ebene einen unmittelbaren(!) Vorgängerknoten mit nodeName == A gibt.
Im obigen Beispiel soll diese if-Bedingung nur auf * zu treffen, also:
if (aktuellerKnoten.???.nodeName == "A")

Ich bekomme nach langem Herumprobieren keine passende Kombination aus parentNode, previousSibling etc. hin, so dass ich wirklich nur auf unmittelbare A-Vorgänger prüfe.

Kann mir einer auf die Sprünge helfen?

Gruß, Volker

--
„I conclude that there are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies."
- Tony Hoare
  1. @@Volker Nebelung:

    ich habe in meinem HTML-Dokument folgende DOM-Struktur:
    TABLE
      TR

    Nein, niemals. TR ist in HTML-Dokumenten niemals Kind von TABLE.

    Ich bekomme nach langem Herumprobieren keine passende Kombination aus parentNode, previousSibling etc. hin, so dass ich wirklich nur auf unmittelbare A-Vorgänger prüfe.

    'parentNode' bedarf es dazu auch nicht.

    if (aktuellerKnoten.previousSibling.nodeName == "A")

    Live long and prosper,
    Gunnar

    --
    Flughafen in Tempelhof
    findet jeder Hempel doof.
    1. @@Volker Nebelung:

      ich habe in meinem HTML-Dokument folgende DOM-Struktur:
      TABLE
        TR

      Nein, niemals. TR ist in HTML-Dokumenten niemals Kind von TABLE.

      das merkt man spätestens dann, wenn man xhtml dokument als xml parsen lässt und versucht im css etwas mit table > tr > td anzusprechen ;)

      1. @@suit:

        Nein, niemals. TR ist in HTML-Dokumenten niemals Kind von TABLE.

        das merkt man spätestens dann, wenn man xhtml dokument als xml parsen lässt und versucht im css etwas mit table > tr > td anzusprechen ;)

        Wobei dieser Versuch gelingt.

        Man merkt es dann, wenn ein XHTML-Dokument mit '<table><tr><td>foo</td></tr></table>' als Tag-Soup geparst wird.

        Live long and prosper,
        Gunnar

        --
        Flughafen in Tempelhof
        findet jeder Hempel doof.
        1. @@suit:

          Nein, niemals. TR ist in HTML-Dokumenten niemals Kind von TABLE.

          das merkt man spätestens dann, wenn man xhtml dokument als xml parsen lässt und versucht im css etwas mit table > tr > td anzusprechen ;)

          Wobei dieser Versuch gelingt.

          sollte eigentlich nicht sein, die optionalen elemente sollten parserintern erzeugt werden
          http://www.edition-w3c.de/TR/2002/REC-xhtml1-20020801/

          1. @@suit:

            sollte eigentlich nicht sein, die optionalen elemente sollten parserintern erzeugt werden
            http://www.edition-w3c.de/TR/2002/REC-xhtml1-20020801/

            In XHTML 1.0 darf 'tr' Kindelement von 'table' sein; da werden keine Elemente parserintern erzeugt. Vgl. https://forum.selfhtml.org/?t=169655&m=1109434

            In HTML 4.01 darf 'tr' nicht Kindelement von 'table' sein; allerdings sind Start- und End-Tag des 'tbody'-Elements optional. Deshalb ist bei HTML-Dokumenten (und XHTML-Dokumenten als 'text/html') in einem 'table'-Element immer ein 'tbody'-Element enthalten.

            Live long and prosper,
            Gunnar

            --
            Flughafen in Tempelhof
            findet jeder Hempel doof.
          2. Hallo,

            sollte eigentlich nicht sein, die optionalen elemente sollten parserintern erzeugt werden

            Genau das Gegenteil trifft für XHTML zu, weil sich XML-DTD keine »impliziten« Elemente formulieren lassen, die immer da sind, aber deren Tags optional sind.

            Mathias

    2. Nein, niemals. TR ist in HTML-Dokumenten niemals Kind von TABLE.

      Ok, stimmt. TBODY fehlt.

      if (aktuellerKnoten.previousSibling.nodeName == "A")

      Tja, das ist eine einfache Lösung, die mir ganz am Anfang natürlich auch schon vorschwebte. Das Problem: Sie ist keine.
      Ein probeweises
      alert(aktuellerKnoten.previousSibling.nodeName);
      gibt mir immer #text aus.

      Gruß, Volker

      --
      „I conclude that there are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies."
      - Tony Hoare
      1. Hallo,

        Ein probeweises
        alert(aktuellerKnoten.previousSibling.nodeName);
        gibt mir immer #text aus.

        Zitat SELFHTML zu nodeName:

        "Berücksichtigen Sie beim Nachvollziehen dieses Beispieles die Besonderheit des Internet Explorers unter Windows im Umgang mit Kindknoten.

        Gruß, Don P

        1. Zitat SELFHTML zu nodeName:

          "Berücksichtigen Sie beim Nachvollziehen dieses Beispieles die Besonderheit des Internet Explorers unter Windows im Umgang mit Kindknoten.

          Ich hab's mit Firefox probiert ...

          Gruß, Volker

          --
          „I conclude that there are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies."
          - Tony Hoare
          1. Hallo,

            Ich hab's mit Firefox probiert ...

            Du solltest *LESEN*, nicht blind probieren ;-).

            Der IE ist der Einzige, der dir da nicht #text ausgibt.

            Gruß, Don P

            1. Du solltest *LESEN*, nicht blind probieren ;-).

              Der IE ist der Einzige, der dir da nicht #text ausgibt.

              Ich verstehe nicht, worauf du hinauswillst. Ich habe das childNode-Array überhaupt nicht benutzt.
              Die von Gunnar vorgeschlagene Lösung gibt mir nur immer nur ein "#text" aus, niemals aber ein "A", was aber - soweit ich das überblicken kann - so sein müsste ...

              Gruß, Volker

              --
              „I conclude that there are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies."
              - Tony Hoare
              1. Hallo,

                Ich verstehe nicht, worauf du hinauswillst. Ich habe das childNode-Array überhaupt nicht benutzt.

                Du stehst total auf dem Schlauch. Jeder Knoten ist Teil eines childnode-Arrays, ob du das nun explizit ansprichst oder nicht.
                previousSibling z.B. holt sich den Vorgängerknoten aus dem childnode-Array des Elternknotens, und das ist immer ein Textknoten, wenn sich sog. Whitespace zwischen den Tags befindet, außer eben im IE unter Windows. Das steht am angeführten Ort doch klar un deutlich.

                Die von Gunnar vorgeschlagene Lösung gibt mir nur immer nur ein "#text" aus, niemals aber ein "A", was aber - soweit ich das überblicken kann - so sein müsste ...

                Es müsste eben nicht so sein, aus dem genannten Grund.

                Gruß, Don P

                1. Du stehst total auf dem Schlauch. Jeder Knoten ist Teil eines childnode-Arrays, ob du das nun explizit ansprichst oder nicht.

                  Das mit dem Schlauch stimmt wohl, meine Aussage war und ist Unsinn.

                  Es müsste eben nicht so sein, aus dem genannten Grund.

                  Und was schlägst du als Lösung vor?

                  Gruß, Volker

                  --
                  „I conclude that there are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies."
                  - Tony Hoare
              2. Hi,

                Die von Gunnar vorgeschlagene Lösung gibt mir nur immer nur ein "#text" aus, niemals aber ein "A", was aber - soweit ich das überblicken kann - so sein müsste ...

                dann gehe davon aus, dass Du es nicht richtig überblickst. Kannst Du bitte die Seite verlinken?

                Cheatah

                --
                X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                X-Will-Answer-Email: No
                X-Please-Search-Archive-First: Absolutely Yes
                1. dann gehe davon aus, dass Du es nicht richtig überblickst.

                  Darum bin ich hier ;-).

                  Kannst Du bitte die Seite verlinken?

                  Hier habe ich die Seite mal testweise im Einsatz (es handelt sich um die Schreibmaschinenfunktion, bei der du mir letztens schon geholfen hast.

                  Erläuterung:
                  Das Skript liest alle Textknoten, welche nicht nur aus Tabs und/oder Zeilenumbrüchen bestehen, aus der Tabelle aus, löscht sie und schreibt sie anschließend wieder zurück.
                  Ich gebe dort probeweise bei jedem Textknoten, welcher wieder mit Inhalt befüllt werden soll, den Namen des Vorgängerknotens mittels
                  alert(knoten.previousSibling.nodeName);
                  aus.

                  Die JS-Datei ist hier nochmal direktverlinkt.

                  Gruß, Volker

                  --
                  „I conclude that there are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies."
                  - Tony Hoare
                  1. Hi,

                    Ich gebe dort probeweise bei jedem Textknoten, welcher wieder mit Inhalt befüllt werden soll, den Namen des Vorgängerknotens mittels
                    alert(knoten.previousSibling.nodeName);
                    aus.

                    nein, nur bei Knoten, der ein <td>-, <a>- oder <li>-Element ist. Diese sind natürlich keine Textknoten.

                    Cheatah

                    --
                    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                    X-Will-Answer-Email: No
                    X-Please-Search-Archive-First: Absolutely Yes
                    1. nein, nur bei Knoten, der ein <td>-, <a>- oder <li>-Element ist. Diese sind natürlich keine Textknoten.

                      Argh, ich bin dir wieder mal zu Dank verpflichtet.
                      Ärgerlich, dass mir solche Flüchtigkeitsfehler immer noch passieren ...

                      Wenn ich mit

                      if (i == 0) { var j = 0; } else { var j = i-1; }  
                      knoten.childNodes.item(j).nodeName
                      

                      darauf zugreife, funktioniert es.

                      Gruß, Volker

                      --
                      „I conclude that there are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies."
                      - Tony Hoare
      2. @@Volker Nebelung:

        Ein probeweises
        alert(aktuellerKnoten.previousSibling.nodeName);
        gibt mir immer #text aus.

        Hm, bei mir nicht: http://bittersmann.de/tests/20080417-previousSibling/

        Live long and prosper,
        Gunnar

        --
        Flughafen in Tempelhof
        findet jeder Hempel doof.