S HTML DOM můžete procházet stromem uzlů pomocí node vztahy.
Podle standardu W3C HTML DOM je vše v dokumentu HTML uzel:
Celý dokument je uzel dokumentu
Každý prvek HTML je uzel prvku
Text uvnitř prvků HTML jsou textové uzly
Každý atribut HTML je uzel atributu (zastaralé)
Všechny komentáře jsou uzly komentářů
Pomocí HTML DOM lze ke všem uzlům ve stromu uzlů přistupovat pomocí JavaScriptu.
Mohou být vytvořeny nové uzly a všechny uzly lze upravit nebo odstranit.
Uzly ve stromu uzlů mají mezi sebou hierarchický vztah.
K popisu vztahů se používají pojmy rodič, dítě a sourozenec.
Ve stromu uzlů se nejvyšší uzel nazývá kořen (nebo kořenový uzel)
Každý uzel má přesně jednoho rodiče, kromě kořene (který nemá žádného rodiče)
Uzel může mít několik potomků
Sourozenci (bratři nebo sestry) jsou uzly se stejným rodičem
<html>
<head>
<title>DOM Tutorial</title>
</head>
<body>
<h1>DOM Lesson one</h1>
<p>Hello world!</p>
</body>
</html>
Z výše uvedeného HTML si můžete přečíst:
<html>
je kořenový uzel
<html>
nemá žádné rodiče
<html>
je nadřazeným prvkem <head>
a < body>
<head>
je prvním potomkem <html>
<body>
je posledním podřízeným prvkem <html>
a :
<head>
má jednoho potomka: <title>
<title>
má jednoho potomka (textový uzel): "Výukový program DOM"
<body>
má dva potomky: <h1>
a < p>
<h1>
má jednoho potomka: "DOM Lekce jedna"
<p>
má jednoho potomka: "Ahoj světe!"
<h1>
a <p>
jsou sourozenci
K navigaci mezi uzly můžete použít následující vlastnosti uzlu JavaScript:
parentNode
childNodes[nodenumber]
firstChild
lastChild
nextSibling
předchozíSourozenec
Běžnou chybou při zpracování modelu DOM je očekávat, že uzel prvku bude obsahovat text.
<title
id="demo">DOM Tutorial</title>
Uzel prvku <title>
(ve výše uvedeném příkladu) neobsahuje text.
Obsahuje textový uzel s hodnotou "DOM Tutorial".
K hodnotě textového uzlu lze přistupovat pomocí vlastnosti uzlu innerHTML
:
myTitle = document.getElementById("demo").innerHTML;
Přístup k vlastnosti innerHTML je stejný jako přístup k nodeValue
prvního dítěte:
myTitle = document.getElementById("demo").firstChild.nodeValue;
Přístup k prvnímu dítěti lze také provést takto:
myTitle = document.getElementById("demo").childNodes[0].nodeValue;
Všechny (3) následující příklady načítají text prvku <h1>
a zkopírují jej do prvku <p>
:
<html>
<body>
<h1 id="id01">My First Page</h1>
<p id="id02"></p>
<script>
document.getElementById("id02").innerHTML
= document.getElementById("id01").innerHTML;
</script>
</body>
</html>
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h1 id="id01">My First Page</h1>
<p id="id02"></p>
<script>
document.getElementById("id02").innerHTML = document.getElementById("id01").innerHTML;
</script>
</body>
</html>
<html>
<body>
<h1 id="id01">My First Page</h1>
<p id="id02"></p>
<script>
document.getElementById("id02").innerHTML = document.getElementById("id01").firstChild.nodeValue;
</script>
</body>
</html>
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h1 id="id01">My First Page</h1>
<p id="id02"></p>
<script>
document.getElementById("id02").innerHTML = document.getElementById("id01").firstChild.nodeValue;
</script>
</body>
</html>
<html>
<body>
<h1 id="id01">My First Page</h1>
<p id="id02">Hello!</p>
<script>
document.getElementById("id02").innerHTML = document.getElementById("id01").childNodes[0].nodeValue;
</script>
</body>
</html>
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h1 id="id01">My First Page</h1>
<p id="id02"></p>
<script>
document.getElementById("id02").innerHTML = document.getElementById("id01").childNodes[0].nodeValue;
</script>
</body>
</html>
V tomto tutoriálu používáme vlastnost innerHTML k načtení obsahu souboru HTML prvek.
Nicméně, učení ostatní výše uvedené metody jsou užitečné pro pochopení stromové struktury a navigace DOM.
Existují dvě speciální vlastnosti, které umožňují přístup k celému dokumentu:
document.body
- Tělo dokumentu
document.documentElement
- Celý dokument
<html>
<body>
<h2>JavaScript HTMLDOM</h2>
<p>Displaying document.body</p>
<p
id="demo"></p>
<script>
document.getElementById("demo").innerHTML
= document.body.innerHTML;
</script>
</body>
</html>
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript HTMLDOM</h2>
<p>Displaying document.body</p>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML = document.body.innerHTML;
</script>
</body>
</html>
<html>
<body>
<h2>JavaScript HTMLDOM</h2>
<p>Displaying document.documentElement</p>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML =
document.documentElement.innerHTML;
</script>
</body>
</html>
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript HTMLDOM</h2>
<p>Displaying document.documentElement</p>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML = document.documentElement.innerHTML;
</script>
</body>
</html>
Vlastnost nodeName
určuje název uzlu.
nodeName je pouze pro čtení
nodeName uzlu prvku je stejný jako název tagu
nodeName uzlu atributu je název atributu
uzelJméno textového uzlu je vždy #text
nodeName uzlu dokumentu je vždy #document
<h1 id="id01">My First Page</h1>
<p id="id02"></p>
<script>
document.getElementById("id02").innerHTML
= document.getElementById("id01").nodeName;
</script>
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h1 id="id01">My First Page</h1>
<p id="id02"></p>
<script>
document.getElementById("id02").innerHTML = document.getElementById("id01").nodeName;
</script>
</body>
</html>
Poznámka: nodeName
vždy obsahuje název značky prvku HTML velkými písmeny.
Vlastnost nodeValue
určuje hodnotu uzlu.
nodeValue pro uzly prvku je null
nodeValue pro textové uzly je samotný text
nodeValue pro uzly atributu je hodnota atributu
Vlastnost nodeType
je pouze pro čtení. Vrací typ uzlu.
<h1 id="id01">My First Page</h1>
<p id="id02"></p>
<script>
document.getElementById("id02").innerHTML
= document.getElementById("id01").nodeType;
</script>
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h1 id="id01">My First Page</h1>
<p id="id02"></p>
<script>
document.getElementById("id02").innerHTML = document.getElementById("id01").nodeType;
</script>
</body>
</html>
Nejdůležitější vlastnosti nodeType jsou:
Node | Type | Example |
---|---|---|
ELEMENT_NODE | 1 | <h1 class="heading">W3Schools</h1> |
ATTRIBUTE_NODE | 2 | class = "heading" (deprecated) |
TEXT_NODE | 3 | W3Schools |
COMMENT_NODE | 8 | <!-- This is a comment --> |
DOCUMENT_NODE | 9 | The HTML document itself (the parent of <html>) |
DOCUMENT_TYPE_NODE | 10 | <!Doctype html> |
Typ 2 je v HTML DOM zastaralý (ale funguje). V XML DOM není zastaralá.