Firefox, DOM i textNode revisited
Jeżeli ktoś czytał mój poprzedni wpis w blogu to wie, że ostatnio mocowałem się z firefoxem i javascript'em. Myślałem, że to koniec moich kłopotów. Ale miałem jeszcze jeden problem z opisywanym wcześniej firstChild. Ale od początku.
Taki xml
<table>
<tr>
<td>cos</td>
</tr>
</table>
będzie w d DOM Insectorze widziany tak:
1. Element table
2. TextNode reprezentujący białe znaki
3. Element tr
4. TextNode reprezentujący białe znaki
5. Element td
... itd.
W momencie kiedy dla elementu table będziemy chcieli wyciągnąć właściwość firstChild dostaniemy: w IE element tr, w Firefoxie TextNode.
Problemu nie będzie jeżeli powyższy xml/html będzie wyglądał np. tak:
<table
><tr
><td>cos</td
></tr
></table>
Lekko 'obrzydliwe'. Można też całkowicie wyrzucić białe znaki i znaki nowej linii.
Więc jak szybko przejść do szukanego elementu w js? Wystarczy zawołać:
tableEl.firstChild.nextSibling
który przejdzie do kolejnego elementu.
Ale nie mamy pewności, że kolejnym elementem na pewno będzie szukany przez nas <tr> (może jakiś komentarz się trafi). Jak rozpoznać że dany element jest textNode'm. Pierwsze moje podejście było jak poniżej:
if (tableEl.firstChild.construcor == Text)
(lub też Element jak kto woli). Trafiłem chwilę później na ciekawą listę. Okazuje się, że każdy element ma właściwość nodeType:
1 Element Node
2 Attribute Node
3 Text Node
4 CDATA Section Node
5 Entity Reference Node
6 Entity Node
7 Processing Instruction Node
8 Comment Node
9 Document Node
10 Document Type Node
11 Document Fragment Node
12 Notation Node
Ponieważ operacje robiłem w pętli, wystarczyło coś takiego:
for (var k = thisRow.nextSibling; k != null; k = k.nextSibling)
{
// jeżeli to nie Element to idziemy dalej
if (k.nodeType != 1)
continue;
/* tutaj robię co trzeba */
}
Mam nadzieję, że komuś się przyda
Powiadamianie o komentarzach
Jeżeli chciałbyś otrzymywać email gdy ta wypowiedź zostanie zaktualizowana, to zarejestruj się tutaj
Subskrybuj komentarze za pomocą