Poznajemy różne typy nodes oraz różnicę między node a element i HTMLElement. Do dzieła.
Klasa node posiada properties nodeName oraz nodeType (to drugie zwraca enum liczbowy). Oba zwracają rodzaj node (węzła):
- Attr – atrybut
- CData section
- Comment – komentarz
- Document – dokument
- DocumentFragment – dokument fragment (znamy to)
- Element – element HTML albo XML
- Text- węzeł tekstowy
Różnica pomiędzy node a elementem jest taka, że węzłem jest wszystko, komentarz, tekst (wewnątrz tagu lub na zewnątrz), sam dokument, fragment dokumentu, atrybut, CData, mamy też typ dokumentu (to już sobie darowałem) i chyba coś jeszcze.
Element:
- ma swój tag
- ma swoje atrybuty
- ma swoje dzieci
- ma classlist, attributes i inne takie
Node (węzeł):
- ma swój textContent, to jego metoda
- jeżeli nie jest elementem, to nie ma atrybutów, tagu , tagName, klasy i tak dalej
Rzućmy okiem na ten przykład:
<ul id="myUl">
Just text node
<li>Text node in li <span>text node in span</span></li>
<li>Li 2 text node</li>
</ul>
<script defer>
let ul = document.querySelector("#myUl");
console.log(ul.childNodes);
</script>
Ul ma 5 childNodes:
- Węzeł tekstowy – just text node
- Element li
- Węzeł tekstowy – newline (enter)
- Element li
- Węzeł tekstowy – newline (enter)
A teraz:
<ul id="myUl">
Just text node
<li>Text node in li <span>text node in span</span></li>
<li>Li 2 text node</li>
</ul>
<script defer>
let ul = document.querySelector("#myUl");
console.log(ul.children);
</script>
Dzieci ma ten ul 2:
- element li
- element li
Ok, zobaczmy węzły-dzieci (childNodes) elementów-dzieci (children) tego ul:
<ul id="myUl">
Just text node
<li>Text node in li <span>text node in span</span></li>
<li>Li 2 text node</li>
</ul>
<script defer>
let ul = document.querySelector("#myUl");
for(let child of ul.children){
console.log(child.childNodes);
}
</script>
Pierwszy 2, drugi 1. Tego się spodziewaliśmy?
- Pierwsze dziecko, childNodes:
- Węzeł tekstowy, Text node in li
- Element span
- Drugie dziecko, childNodes:
- Węzeł tekstowy, Li 2 text node
Ok, a dzieci dzieci?
<ul id="myUl">
Just text node
<li>Text node in li <span>text node in span</span></li>
<li>Li 2 text node</li>
</ul>
<script defer>
let ul = document.querySelector("#myUl");
for(let child of ul.children){
console.log(child.children);
}
</script>
Pierwszy 1 dziecko (span), drugi zero dzieci, bo zero elementów HTML tam.
Ok, taki skrypt:
<ul id="myUl">
Just text node
<li>Text node in li <span>text node in span</span></li>
<li>Li 2 text node</li>
</ul>
<script defer>
let ul = document.querySelector("#myUl");
console.log("Child elements count: " + ul.childElementCount); //2
console.log("Child nodes count: " +ul.childNodes.length); //5
</script>
Mam nadzieję, że nas nie dziwi. O HTMLElement w następnej lekcji, można się na razie domyślić, że to element, ale ściśle HTML (XML odpada).