JavaScript: Manipulação do DOM
Última atualização: 2026-10-13
O DOM (Document Object Model) é uma árvore que o navegador cria a partir do documento HTML. Operando nessa árvore com JavaScript, você pode mudar dinamicamente o conteúdo, a estrutura e os atributos da página — como colher frutas de uma árvore, enxertar novos galhos ou podar madeira morta.
1. Selecionando Elementos
O primeiro passo na manipulação do DOM é sempre "encontrar primeiro".
| Método | Retorna | Descrição |
|---|---|---|
getElementById('id') |
Elemento único | Mais rápido, id é único |
getElementsByClassName('cls') |
HTMLCollection | Coleção ao vivo, sincroniza com mudanças no DOM |
getElementsByTagName('tag') |
HTMLCollection | Igual ao anterior |
querySelector('seletor') |
Elemento único | Seletor CSS, retorna o primeiro que combina |
querySelectorAll('seletor') |
NodeList | Coleção estática, não muda com o DOM |
💡 Dica: Família
querySelector vs getElementBy*: a primeira usa seletores CSS (mais flexível), a segunda tem desempenho levemente melhor. Para o dia a dia, prefira querySelector — é mais intuitivo.
HTML
<div id="box" class="card active">Olá</div>
<div class="card">Mundo</div>
<p class="card">JS</p>
<script>
const porId = document.getElementById('box');
console.log('porId:', porId.textContent);
const porClasse = document.getElementsByClassName('card');
console.log('porClasse contagem:', porClasse.length);
const porTag = document.getElementsByTagName('p');
console.log('porTag:', porTag[0].textContent);
const primeiro = document.querySelector('.card');
console.log('querySelector:', primeiro.textContent);
const todos = document.querySelectorAll('.card');
console.log('querySelectorAll contagem:', todos.length);
</script>
2. Modificando Conteúdo
Depois de encontrar um elemento, a necessidade mais comum é mudar "o que ele diz".
textContent: lê/escreve texto puro, seguro e eficiente.innerHTML: lê/escreve strings HTML, pode inserir tags, mas tem risco de XSS.
⚠️ Nota: Nunca use
innerHTML para inserir conteúdo fornecido pelo usuário, senão atacantes podem injetar scripts maliciosos. É como afixar uma carta de um diretamente no mural — a carta pode conter uma "bomba".
▶ Exemplo: textContent vs innerHTML
▶ Experimente3. Modificando Atributos
Atributos de elementos HTML (id, class, src, href, etc.) também podem ser lidos e escritos com JS.
| Método | Descrição |
|---|---|
getAttribute('nome') |
Ler valor do atributo |
setAttribute('nome', 'valor') |
Definir atributo |
removeAttribute('nome') |
Remover atributo |
💡 Dica: Alguns atributos podem ser acessados diretamente com notação de ponto:
el.id, el.className, el.src. Mas para atributos customizados (data-*), use getAttribute ou el.dataset.
▶ Exemplo: Manipulando Atributos de Link
▶ Experimente4. Criando e Inserindo Elementos
Uma das habilidades centrais de manipulação do DOM: "criar" um elemento do nada, depois conectá-lo à árvore.
| Método | Descrição |
|---|---|
createElement('tag') |
Criar nó de elemento |
createTextNode('texto') |
Criar nó de texto |
appendChild(filho) |
Anexar ao final |
insertBefore(novo, ref) |
Inserir antes de ref |
▶ Exemplo: Adicionando Itens de Lista Dinamicamente
▶ Experimente5. Removendo e Clonando Elementos
| Método | Descrição |
|---|---|
removeChild(filho) |
Pai remove nó filho |
remove() |
Elemento remove a si mesmo (API mais recente) |
cloneNode(true/false) |
true = clone profundo (incluindo filhos), false = clone raso |
💡 Dica:
remove() é mais simples que removeChild(), mas se você precisar obter o nó removido para processamento posterior, use removeChild() — ele retorna o nó removido.
▶ Exemplo: Removendo e Clonando
▶ Experimente❓ Perguntas Frequentes
P O que acontece se
querySelector retornar null?R Chamar qualquer propriedade/método em
null lançará um TypeError. Então é melhor verificar antes de operar: const el = document.querySelector('.xxx'); if (el) { ... }.R
HTMLCollection é ao vivo — atualiza automaticamente quando o DOM muda; NodeList de querySelectorAll é um snapshot estático. Ao iterar e adicionar/remover elementos, uma coleção estática é mais segura, senão você pode entrar em loop infinito.P O que acontece se você fizer
appendChild de um nó que já existe?R O nó "se move" da posição original para a nova posição. No DOM, o mesmo nó só pode aparecer uma vez. Isso é uma cópia, não uma movimentação.
📖 Resumo
- Dois campos para selecionar elementos:
getElementBy*(melhor desempenho) equerySelector*(mais flexível). Para o dia a dia,querySelectoré suficiente. - Use
textContentpara alterações de texto, useinnerHTMLapenas quando precisar de HTML. Este último requer prevenção de XSS. - Operações com atributos:
getAttributepara ler,setAttributepara escrever,removeAttributepara excluir. - Fluxo padrão para criar elementos:
createElement→ definir conteúdo/atributos →appendChildpara montar. - Duas formas de remover elementos:
remove()(elemento remove a si mesmo),removeChild()(pai remove e você recebe o nó de volta). cloneNode(true)clona profundamente incluindo todos os descendentes,cloneNode(false)clona apenas a casca.
📝 Exercícios
- Básico: Crie uma página que use
createElementeappendChildpara gerar dinamicamente uma lista contendo 5 nomes de cidades. - Intermediário: Adicione um botão de exclusão à lista do exercício anterior. Quando clicado, use
removeChildpara excluir o item da lista correspondente. - Desafio: Implemente um simples "gerenciador de notas" — um campo de input + botão de adicionar. Cada vez que você adicionar uma nota, crie um cartão com um botão de exclusão. Clicar no botão de exclusão remove aquele cartão.