Typ des Vorgängerknoten bestimmen
![](/uploads/default_avatar/thumb/missing.png)
- javascript
0 Gunnar Bittersmann
0 suit0 Volker Nebelung
0 Don P0 Volker Nebelung
0 Don P0 Volker Nebelung
0 Gunnar Bittersmann
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
@@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
@@Volker Nebelung:
ich habe in meinem HTML-Dokument folgende DOM-Struktur:
TABLE
TRNein, 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 ;)
@@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
@@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/
@@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
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
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
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
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
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
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
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
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
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
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
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
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
@@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