Objeto Node: Navegando pelo DOM - JavaScript
Cada nó individual, seja um elemento HTML, seu atributo ou texto, é representado na estrutura do DOM por um objeto Node. Pode surgir a pergunta: como os elementos de uma página web estão relacionados aos nós dessa mesma página? É importante notar que todo elemento de uma página web é um nó, mas nem todo nó é um elemento; por exemplo, os atributos e o texto dos elementos também são nós separados.
O objeto Node oferece uma série de propriedades que nos permitem obter informações sobre o nó em questão:
: contém uma coleção de nós filhos.childNodes
: contém uma coleção de nós filhos que são elementos.children
: retorna o primeiro nó filho do nó atual.firstChild
: retorna o primeiro nó filho que é um elemento.firstElementChild
: retorna o último nó filho do nó atual.lastChild
: retorna o último nó filho que é um elemento.lastElementChild
: retorna o nó anterior que está no mesmo nível que o atual.previousSibling
: retorna o próximo nó que está no mesmo nível que o atual.nextSibling
: retorna o nó anterior que é um elemento e que está no mesmo nível que o atual.previousElementSibling
: retorna o próximo nó que é um elemento e que está no mesmo nível que o atual.nextElementSibling
: retorna o nó raiz do documento.ownerDocument
: retorna o nó pai do nó atual.parentNode
: retorna o nó pai que é um elemento.parentElement
: retorna o nome do nó.nodeName
: retorna o tipo de nó em forma de número.nodeType
: retorna o texto do nó de texto.nodeValue
Primeiramente, podemos usar as propriedades nodeName
nodeType
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<div id="article">
<h1 id="header">Home Page</h1>
<p>Page Text</p>
</div>
<script>
const article = document.getElementById("article");
console.log(article.nodeName); // DIV
console.log(article.nodeType); // 1
</script>
</body>
</html>
Aqui, obtemos informações sobre o elemento com o id="header"
nodeName
div
nodeType
1
nodeType 1: | Elemento |
nodeType 2: | Atributo |
nodeType 3: | Texto |
Obtendo o Elemento Pai
Para obter o elemento pai, utilizamos as propriedades parentNode
parentElement
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<div id="article">
<h1 id="header">Home Page</h1>
<p>Page Text</p>
</div>
<script>
// Selecionando o elemento com id="header"
const header = document.getElementById("header");
// Obtendo o elemento pai
const headerParent = header?.parentElement;
// Também pode ser assim
// const headerParent = header?.parentNode;
console.log(headerParent); // Exibe o elemento pai no console
</script>
</body>
</html>
Neste exemplo, exibimos no console o elemento que contém o elemento com id="header"
É importante notar que, embora ambos os métodos geralmente retornem o mesmo elemento, há uma exceção: o elemento <html>
document
null
const htmlEl = document.getElementsByTagName("html")[0];
const parentElem = htmlEl.parentElement;
const parentNode = htmlEl.parentNode;
console.log(parentElem); // null
console.log(parentNode); // objeto document
Obtendo Nós Filhos
O método hasChildNodes()
true
const article = document.querySelector("div");
if(article.hasChildNodes()) {
console.log("There are child nodes");
}
else {
console.log("No child nodes");
}
Para obter elementos filhos, podemos usar a propriedade children
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<div id="article">
<h1 id="header">Home Page</h1>
<p>Page Text</p>
</div>
<script>
// Selecionando o elemento com id="article"
const article = document.getElementById("article");
for(elem of article.children) {
console.log(elem);
}
</script>
</body>
</html>
Aqui, exibimos no console todos os elementos filhos do elemento com id="article"
<h1 id="header">Home Page</h1> <p>Page Text</p>
Se quisermos selecionar todos os nós filhos (não apenas elementos, mas também atributos e texto), usamos o método childNodes
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<div id="article">
<h1 id="header">Home Page</h1>
<p>Page Text</p>
</div>
<script>
// Selecionando o elemento com id="article"
const article = document.getElementById("article");
for(node of article.childNodes) {
let type = "";
if(node.nodeType === 1) type = "elemento";
else if(node.nodeType === 2) type = "atributo";
else if(node.nodeType === 3) type = "texto";
console.log(node.nodeName, ": ", type);
}
</script>
</body>
</html>
Aqui, selecionamos o mesmo elemento, mas agora percorremos seus nós. O console exibirá cinco nós, incluindo espaços entre elementos que também são considerados nós de texto:
#text : texto H1 : elemento #text : texto P : elemento #text : texto
É importante notar que os espaços em branco são considerados nós de texto. Se não houvesse espaços entre as tags, o console exibiria apenas três nós:
<div id="article"><h1 id="header">Home Page</h1><p>Page Text</p></div>
H1 : elemento P : elemento
Obtendo o Primeiro e o Último Elemento/Nó
Para obter o primeiro e o último nó/elemento, usamos as propriedades firstChild
firstElementChild
lastChild
lastElementChild
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<div id="article">
<h1 id="header">Home Page</h1>
<p>Page Text</p>
</div>
<script>
const article = document.getElementById("article");
console.log("First Child:", article.firstElementChild);
console.log("Last Child:", article.lastElementChild);
</script>
</body>
</html>
Resultado no console:
First Child: <h1 id="header">Home Page</h1> Last Child: <p>Page Text</p>
Contando os Elementos Filhos
Para contar o número de elementos filhos, usamos a propriedade childElementCount
children.length
const article = document.getElementById("article");
console.log(article.childElementCount); // 2
console.log(article.children.length); // 2
Obtendo Elementos do Mesmo Nível
As propriedades previousSibling
previousElementSibling
nextSibling
nextElementSibling
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<div id="article">
<h1 id="header">Home Page</h1>
<p>Page Text 1</p>
<p>Page Text 2</p>
<p>Page Text 3</p>
</div>
<script>
const article = document.getElementById("article");
let tempNode = article.firstElementChild;
while(tempNode != null) {
console.log(tempNode);
tempNode = tempNode.nextElementSibling;
}
</script>
</body>
</html>
Aqui, obtemos o elemento com id="article"
tempNode
tempNode
null
Também é possível iterar os nós em ordem inversa: primeiro obtemos o último nó e, então, acessamos o nó irmão anterior:
const article = document.getElementById("article");
let tempNode = article.lastElementChild;
while(tempNode != null) {
console.log(tempNode);
tempNode = tempNode.previousElementSibling;
}
Obtendo o Conteúdo Textual e nodeValue
A propriedade nodeValue
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<div id="article">
<h1 id="header">Home Page</h1>
<p id="text">Page Text</p>
</div>
<script>
// Obtendo o elemento com id="text"
const pageText = document.getElementById("text");
console.log(pageText.nodeValue); // null
for(textNode of pageText.childNodes) {
console.log(textNode.nodeValue);
}
</script>
</body>
</html>
Neste caso, tentamos obter o texto do elemento com id="text"
pageText
nodeValue
null
console.log(pageText.nodeValue); // null
Isso ocorre porque o elemento obtido não é um nó de texto. O nó de texto está localizado dentro do elemento pageText
childNodes
for(textNode of pageText.childNodes) {
console.log(textNode.nodeValue);
}
Embora possamos obter o conteúdo textual dos elementos desta forma, não é o método mais otimizado, e exploraremos outros métodos posteriormente.