Document Object Model (DOM)
O Document Object Model (DOM) é uma interface de programação que representa a estrutura de um documento HTML ou XML como uma árvore de objetos. Cada elemento, atributo e texto do documento vira um nó dessa árvore, e é isso que permite que o JavaScript acesse e modifique o conteúdo, a estrutura e o estilo de uma página dinamicamente.
Nota: XML, ou Extensible Markup Language (Linguagem de Marcação Extensível), é uma linguagem de marcação usada para representar dados de forma estruturada. Ela foi projetada para ser autoexplicativa e flexível, permitindo a definição de diferentes tipos de documentos e dados.
Para visualizar melhor, veja como o HTML abaixo é convertido em uma árvore de nós:
<html>
<body>
<h1>Título</h1>
<p>Um parágrafo.</p>
</body>
</html>
html
└── body
├── h1 ("Título")
└── p ("Um parágrafo.")
O elemento <html> é a raiz da árvore. Ele tem um único filho, <body>, que por sua vez tem dois filhos: <h1> e <p>. O texto dentro de cada tag também é representado como um nó (um “text node”).
Com essa estrutura em mente, o DOM oferece um conjunto de funcionalidades para trabalhar com o documento:
-
Representação hierárquica: os elementos HTML/XML são organizados em uma árvore, onde cada elemento é um nó.
-
Acesso aos elementos: é possível localizar elementos pelo ID, pela classe, pela tag ou por outros atributos.
-
Manipulação dinâmica: é possível adicionar, remover e modificar elementos e conteúdo da página usando métodos do DOM.
-
Manipulação de estilo: também é possível alterar o estilo dos elementos, como cor, tamanho e posicionamento.
-
Eventos e interação: o DOM permite vincular eventos a elementos, como cliques, passar o mouse ou pressionar teclas, tornando a página interativa.
Nas próximas seções, vamos ver na prática como selecionar elementos e como manipular a estrutura e o estilo de uma página usando essas funcionalidades.
Métodos de seleção
Antes de manipular um elemento, é preciso selecioná-lo. O DOM oferece diferentes métodos para isso:
-
getElementById(): seleciona um elemento pelo seu ID único.
-
getElementsByClassName(): seleciona todos os elementos que possuem determinada classe.
-
getElementsByTagName(): seleciona todos os elementos de uma determinada tag.
-
querySelector(): seleciona o primeiro elemento que corresponde a um seletor CSS.
O método querySelector() é o mais flexível, pois aceita qualquer seletor CSS: ID, classe, tag, atributo, entre outros. Veja alguns exemplos:
// por ID (usa #)
var titulo = document.querySelector("#titulo");
// por classe (usa .)
var paragrafo = document.querySelector(".paragrafo");
// por atributo
var elemento = document.querySelector("[data-id='123']");
Navegação entre nós relacionados
Depois de selecionar um elemento, é comum precisar acessar quem está ao seu redor na árvore: o pai, os filhos ou os irmãos. O DOM oferece propriedades para isso:
var paragrafo = document.querySelector("#paragrafo");
paragrafo.parentNode; // o elemento pai de paragrafo
paragrafo.children; // os elementos filhos de paragrafo
paragrafo.firstElementChild; // o primeiro filho de paragrafo
paragrafo.nextElementSibling; // o próximo elemento no mesmo nível
Essas propriedades evitam ter que selecionar cada elemento pelo ID: a partir de um único nó, é possível “caminhar” pela árvore em qualquer direção.
Manipulação da estrutura do HTML
Depois de selecionar um elemento, podemos criar, remover ou atualizar conteúdo. O HTML abaixo será usado como base para os três exemplos a seguir:
<!DOCTYPE html>
<html>
<head>
<title>Manipulação do DOM</title>
</head>
<body>
<h1 id="titulo">Manipulação do DOM</h1>
<p id="paragrafo">Este é um parágrafo de exemplo.</p>
<button onclick="adicionarParagrafo()">Adicionar Parágrafo</button>
<button onclick="removerParagrafo()">Remover Parágrafo</button>
<button onclick="atualizarTitulo()">Atualizar Título</button>
<script>
function adicionarParagrafo() {
// cria um novo elemento <p>
var novoParagrafo = document.createElement("p");
novoParagrafo.textContent = "Novo parágrafo adicionado dinamicamente.";
// adiciona o parágrafo ao final do corpo da página
document.body.appendChild(novoParagrafo);
}
function removerParagrafo() {
var paragrafo = document.getElementById("paragrafo");
paragrafo.remove();
}
function atualizarTitulo() {
var titulo = document.getElementById("titulo");
titulo.textContent = "Novo Título Atualizado";
}
</script>
</body>
</html>
Cada função ilustra uma operação diferente sobre o mesmo documento:
-
adicionarParagrafo()cria um novo elemento com createElement() e o insere no final do<body>com appendChild(). -
removerParagrafo()localiza o parágrafo pelo ID e o remove do documento com remove(). -
atualizarTitulo()localiza o título pelo ID e substitui seu texto usando a propriedadetextContent.
Criando e inserindo texto manualmente
O exemplo anterior usou textContent para definir o texto de um elemento inteiro de uma vez. Também é possível criar um nó de texto separado com createTextNode() e inserir esse nó em uma posição específica com insertBefore():
var novoTexto = document.createTextNode("Texto inserido antes do título.");
var titulo = document.getElementById("titulo");
// insere novoTexto antes do elemento titulo, no mesmo pai
titulo.parentNode.insertBefore(novoTexto, titulo);
Essa abordagem é mais detalhada, mas dá mais controle sobre onde exatamente o novo conteúdo entra na árvore, ao invés de sempre adicionar no final.
Manipulação do estilo do HTML
Além do conteúdo, o DOM também permite alterar o estilo visual de um elemento por meio da propriedade style. O exemplo a seguir mostra como mudar a cor de fundo e o tamanho da fonte de um mesmo elemento:
<!DOCTYPE html>
<html>
<head>
<title>Alteração de Estilo</title>
<style>
.elemento {
width: 200px;
height: 100px;
background-color: yellow;
border: 1px solid black;
font-size: 16px;
}
</style>
</head>
<body>
<div class="elemento">Elemento com estilo inicial</div>
<button onclick="alterarCorFundo()">Alterar Cor de Fundo</button>
<button onclick="alterarTamanhoFonte()">Alterar Tamanho da Fonte</button>
<script>
function alterarCorFundo() {
var elemento = document.querySelector(".elemento");
elemento.style.backgroundColor = "blue";
}
function alterarTamanhoFonte() {
var elemento = document.querySelector(".elemento");
elemento.style.fontSize = "24px";
}
</script>
</body>
</html>
Ao clicar em “Alterar Cor de Fundo”, a cor do elemento muda para azul. Ao clicar em “Alterar Tamanho da Fonte”, o texto passa a ser exibido em 24px. Note que o estilo é acessado e modificado por meio do atributo style, da mesma forma como fizemos com o conteúdo na seção anterior.
Trabalhando com classes (classList)
Alterar propriedades de style uma a uma funciona, mas em geral é mais organizado definir os estilos em uma classe CSS e apenas adicionar ou remover essa classe via JavaScript. Para isso, o DOM oferece a propriedade classList:
.destaque {
background-color: yellow;
font-weight: bold;
}
var elemento = document.querySelector(".elemento");
elemento.classList.add("destaque"); // adiciona a classe "destaque"
elemento.classList.remove("destaque"); // remove a classe "destaque"
elemento.classList.toggle("destaque"); // alterna: adiciona se não tiver, remove se tiver
O método toggle() é muito usado em botões de “ativar/desativar”, já que alterna o estado da classe a cada clique, sem precisar verificar se ela já está presente.
Eventos
Nos exemplos anteriores, usamos o atributo onclick diretamente no HTML para simplificar. Na prática, o mais comum é usar addEventListener() para vincular um evento a um elemento a partir do JavaScript, sem misturar HTML e código:
var botao = document.querySelector("#meuBotao");
botao.addEventListener("click", function () {
console.log("O botão foi clicado!");
});
O mesmo padrão funciona para outros eventos, como digitar em um campo de texto:
var campo = document.querySelector("#meuCampo");
campo.addEventListener("input", function () {
console.log("Valor atual: " + campo.value);
});
Separar o JavaScript do HTML dessa forma facilita a manutenção do código, principalmente quando há muitos elementos e eventos na página.
Juntando tudo o que vimos, manipular o DOM se resume a quatro frentes: mudar a estrutura do documento (criar, mover e remover nós), mudar o estilo (via style ou classList), reagir a eventos do usuário e, por trás de tudo isso, navegar pela árvore para encontrar os nós certos.
Exercícios de Fixação Práticos
-
Selecionando elementos
Crie uma página com um
<h1 id="titulo">e um<p class="texto">. Escreva um script que selecione os dois elementos (um comgetElementById()e outro comquerySelector()) e imprima otextContentde cada um no console. -
Adicionando um item a uma lista
Crie uma
<ul id="lista">vazia e um botão. Ao clicar no botão, usecreateElement(), defina o texto comtextContente adicione o novo<li>à lista comappendChild(). Cada clique deve adicionar um novo item. -
Removendo o último item
Na mesma lista do exercício anterior, adicione um segundo botão que remova o último
<li>da lista, usandolastElementChilderemove(). -
Alternando uma classe
Crie uma
<div>com uma classe CSS.destaque(por exemplo, com fundo amarelo). Adicione um botão que useclassList.toggle("destaque")para ativar e desativar o estilo a cada clique. -
Contando cliques com addEventListener
Crie um botão e um
<span id="contador">0</span>. UseaddEventListener("click", ...)para incrementar o número exibido no<span>a cada clique no botão. -
Navegando pela árvore
Crie uma lista
<ul>com 3 itens<li>. Selecione o item do meio comquerySelector()e, a partir dele, acesse e imprima no console o texto do irmão anterior e do irmão seguinte usandopreviousElementSiblingenextElementSibling.
Exercício de Fixação Teórico 📚
Referências
-
MILETTO, Evandro Manara. Desenvolvimento de software II: introdução ao desenvolvimento web com html, css, javascript e php. Porto Alegre Bookman 2014 1 recurso online ISBN 9788582601969.

CC BY 4.0 DEED