Com o HTML DOM, você pode navegar na árvore de nós usando node relacionamentos.
De acordo com o padrão W3C HTML DOM, tudo em um documento HTML é um nó:
O documento inteiro é um nó de documento
Cada elemento HTML é um nó de elemento
O texto dentro dos elementos HTML são nós de texto
Cada atributo HTML é um nó de atributo (obsoleto)
Todos os comentários são nós de comentários
Com o HTML DOM, todos os nós da árvore de nós podem ser acessados por JavaScript.
Novos nós podem ser criados e todos nós podem ser modificados ou excluídos.
Os nós na árvore de nós têm um relacionamento hierárquico entre si.
Os termos pai, filho e irmão são usados para descrever os relacionamentos.
Em uma árvore de nós, o nó superior é chamado de raiz (ou nó raiz)
Cada nó tem exatamente um pai, exceto a raiz (que não tem pai)
Um nó pode ter vários filhos
Irmãos (irmãos ou irmãs) são nós com o mesmo pai
<html>
<head>
<title>DOM Tutorial</title>
</head>
<body>
<h1>DOM Lesson one</h1>
<p>Hello world!</p>
</body>
</html>
No HTML acima você pode ler:
<html> é o nó raiz
<html> não tem pais
<html> é o pai de <head> e < corpo>
<head> é o primeiro filho de <html>
<body> é o último filho de <html>
e :
<head> tem um filho: <title>
<title> tem um filho (um nó de texto): "DOM Tutorial"
<body> tem dois filhos: <h1> e < p>
<h1> tem um filho: "DOM Lesson one"
<p> tem um filho: "Olá, mundo!"
<h1> e <p> são irmãos
Você pode usar as seguintes propriedades de nó para navegar entre nós com JavaScript:
parentNode
childNodes[nodenumber]
firstChild
lastChild
próximo irmão
anteriorIrmão
Um erro comum no processamento DOM é esperar que um nó de elemento contenha texto.
<title
id="demo">DOM Tutorial</title>O nó do elemento <title> (no exemplo acima) não contém texto.
Ele contém um nó de texto com o valor "DOM Tutorial".
O valor do nó de texto pode ser acessado pela propriedade innerHTML do nó:
myTitle = document.getElementById("demo").innerHTML;Acessar a propriedade innerHTML é o mesmo que acessar o nodeValue do primeiro filho:
myTitle = document.getElementById("demo").firstChild.nodeValue;O acesso ao primeiro filho também pode ser feito assim:
myTitle = document.getElementById("demo").childNodes[0].nodeValue;Todos os (3) exemplos a seguir recuperam o texto de um elemento <h1> e o copiam em um elemento <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>Experimente você mesmo →
<!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>Experimente você mesmo →
<!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>Experimente você mesmo →
<!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>
Neste tutorial usamos a propriedade innerHTML para recuperar o conteúdo de um Elemento HTML.
No entanto, aprender os outros métodos acima são úteis para compreender a estrutura da árvore e o navegação do DOM.
Existem duas propriedades especiais que permitem acesso ao documento completo:
document.body - O corpo do documento
document.documentElement - O documento completo
<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>Experimente você mesmo →
<!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>Experimente você mesmo →
<!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>
A propriedade nodeName especifica o nome de um nó.
nodeName é somente leitura
nodeName de um elemento node é igual ao nome da tag
nodeName de um nó de atributo é o nome do atributo
nodeName de um nó de texto é sempre #text
nodeName do nó do documento é sempre #document
<h1 id="id01">My First Page</h1>
<p id="id02"></p>
<script>
document.getElementById("id02").innerHTML
= document.getElementById("id01").nodeName;
</script>Experimente você mesmo →
<!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>
Observação: nodeName sempre contém o nome da tag em maiúscula de um elemento HTML.
A propriedade nodeValue especifica o valor de um nó.
nodeValue para nós de elemento é null
nodeValue para nós de texto é o próprio texto
nodeValue para nós de atributos é o valor do atributo
A propriedade nodeType é somente leitura. Ele retorna o tipo de um nó.
<h1 id="id01">My First Page</h1>
<p id="id02"></p>
<script>
document.getElementById("id02").innerHTML
= document.getElementById("id01").nodeType;
</script>Experimente você mesmo →
<!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>
As propriedades nodeType mais importantes são:
| 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> |
O tipo 2 está obsoleto no HTML DOM (mas funciona). Não está obsoleto no XML DOM.