Manipulando o DOM
Esta aula aborda as principais técnicas de manipulação do DOM em JavaScript, incluindo a diferença entre textContent e innerHTML, alteração de atributos e estilos, e criação/remoção de elementos. Você aprenderá na prática como modificar páginas web dinamicamente.
Manipular o DOM (Document Object Model) é uma habilidade essencial para criar páginas web interativas. O DOM representa a estrutura da página como uma árvore de objetos, e o JavaScript nos permite acessar e modificar esses objetos em tempo real. Nesta aula, vamos explorar quatro tópicos fundamentais: a diferença entre textContent e innerHTML, como alterar atributos, como modificar estilos e como criar e remover elementos dinamicamente.
Esses conceitos são a base para construir interfaces dinâmicas, como atualizar conteúdo sem recarregar a página, aplicar estilos condicionais, e adicionar ou remover elementos em resposta a ações do usuário. Vamos começar!
textContent vs innerHTML
Ambos são propriedades usadas para obter ou definir o conteúdo de um elemento, mas com diferenças importantes.
textContent retorna ou define apenas o texto puro, ignorando qualquer marcação HTML. É mais seguro e rápido, pois não interpreta HTML. Já innerHTML retorna ou define o conteúdo como HTML, permitindo incluir tags. No entanto, ao usar innerHTML com dados do usuário, há risco de segurança (XSS).
Exemplo prático:
// HTML: <div id="exemplo">Olá <strong>Mundo</strong>!</div>
const div = document.getElementById('exemplo');
console.log(div.textContent); // "Olá Mundo!"
console.log(div.innerHTML); // "Olá <strong>Mundo</strong>!"
// Alterando com textContent
div.textContent = 'Novo texto'; // Resultado: <div>Novo texto</div>
// Alterando com innerHTML
div.innerHTML = '<em>Itálico</em>'; // Resultado: <div><em>Itálico</em></div>
Use textContent quando quiser apenas texto. Use innerHTML quando precisar inserir HTML, mas tome cuidado com a segurança.
Atributos
Podemos ler e modificar atributos de elementos HTML, como src, href, disabled, etc. Os principais métodos são getAttribute(), setAttribute(), removeAttribute() e a propriedade attributes.
Além disso, para atributos comuns, podemos acessá-los diretamente como propriedades do elemento (ex.: element.id, element.src). No entanto, para atributos personalizados (data-*), use dataset.
Exemplo prático:
// HTML: <a id="link" href="https://example.com" target="_blank" data-info="externo">Clique</a>
const link = document.getElementById('link');
// Lendo atributos
console.log(link.getAttribute('href')); // "https://example.com"
console.log(link.href); // URL completa: "https://example.com/"
console.log(link.dataset.info); // "externo"
// Modificando
link.setAttribute('href', 'https://novo.com');
link.target = '_self';
link.dataset.info = 'interno';
// Removendo
link.removeAttribute('target');
Prefira usar propriedades diretas quando possível, pois são mais rápidas e legíveis. Use setAttribute para atributos que não têm propriedade correspondente (ex.: aria-*).
Estilos
Para alterar estilos CSS via JavaScript, usamos a propriedade style de um elemento. Ela permite modificar estilos inline. Para ler estilos computados (aplicados por CSS), usamos getComputedStyle().
É importante notar que propriedades CSS com hífen (ex.: background-color) são convertidas para camelCase no JavaScript (backgroundColor).
Exemplo prático:
const box = document.getElementById('box');
// Alterando estilo diretamente
box.style.backgroundColor = 'red';
box.style.fontSize = '20px';
box.style.border = '2px solid black';
// Lendo estilo inline
console.log(box.style.backgroundColor); // 'red'
// Lendo estilo computado
const estilo = window.getComputedStyle(box);
console.log(estilo.backgroundColor); // 'rgb(255, 0, 0)'
// Removendo estilo inline
box.style.removeProperty('background-color');
Para múltiplas alterações, considere usar classes CSS e classList em vez de manipular style diretamente. Exemplo:
box.classList.add('destaque');
box.classList.remove('inativo');
box.classList.toggle('ativo');
Criar/remover elementos
Para criar novos elementos, usamos document.createElement(). Para adicioná-los ao DOM, usamos métodos como appendChild(), append(), prepend(), before(), after(), insertAdjacentHTML(), etc. Para remover, usamos removeChild() ou remove().
Exemplo prático:
// Criando um novo elemento
const novoParagrafo = document.createElement('p');
novoParagrafo.textContent = 'Este é um novo parágrafo.';
novoParagrafo.classList.add('novo');
// Adicionando ao final do body
document.body.appendChild(novoParagrafo);
// Adicionando antes de outro elemento
const referencia = document.getElementById('ref');
referencia.before(novoParagrafo); // ou referencia.parentNode.insertBefore(novoParagrafo, referencia);
// Removendo o elemento
novoParagrafo.remove(); // ou novoParagrafo.parentNode.removeChild(novoParagrafo);
// Inserindo HTML diretamente
const lista = document.getElementById('lista');
lista.insertAdjacentHTML('beforeend', '<li>Item novo</li>');
Lembre-se de que remove() é mais moderno e não requer referência ao pai. Para remover todos os filhos de um elemento, use element.innerHTML = '' ou um loop com removeChild.
Boas práticas
- Prefira
textContentainnerHTMLpara segurança e desempenho. - Use
classListpara manipular classes em vez declassNameousetAttribute('class', ...). - Armazene referências a elementos frequentemente usados em variáveis para evitar consultas repetidas ao DOM.
- Ao criar muitos elementos, use
DocumentFragmentpara melhor desempenho. - Evite manipular o DOM em loops intensos; prefira construir uma string HTML e inserir de uma vez.
Referências
- MDN: Introdução ao DOM
- MDN: textContent
- MDN: innerHTML
- MDN: setAttribute
- MDN: classList
- MDN: style
- MDN: createElement
- MDN: appendChild
- MDN: remove
Exercícios
Dado o HTML
<div id="info">Olá <b>Mundo</b></div>, escreva código para alterar o conteúdo para<i>Novo</i> conteúdousandoinnerHTML. Depois, usandotextContent, altere para "Apenas texto".✓ Resposta:const div = document.getElementById('info'); div.innerHTML = '<i>Novo</i> conteúdo'; div.textContent = 'Apenas texto';Crie um link (
<a>) comid="meuLink"ehref="https://google.com". Usando JavaScript, altere o atributohrefparahttps://bing.come adicionetarget="_blank". Verifique no console o valor dehrefapós a alteração.✓ Resposta:const link = document.getElementById('meuLink'); link.href = 'https://bing.com'; link.target = '_blank'; console.log(link.href); // "https://bing.com/"Dado um elemento
<div id="box"></div>, use JavaScript para definir a cor de fundo como azul (blue), largura200pxe altura100px. Depois, remova a propriedade de largura.✓ Resposta:const box = document.getElementById('box'); box.style.backgroundColor = 'blue'; box.style.width = '200px'; box.style.height = '100px'; box.style.removeProperty('width');Crie uma lista não ordenada (
<ul>) comid="lista"e três itens (<li>) com textos "Item 1", "Item 2", "Item 3". Usando JavaScript, adicione um novo item "Item 4" ao final da lista e depois remova o primeiro item.✓ Resposta:const lista = document.getElementById('lista'); const novoItem = document.createElement('li'); novoItem.textContent = 'Item 4'; lista.appendChild(novoItem); const primeiroItem = lista.querySelector('li:first-child'); lista.removeChild(primeiroItem);Dado o HTML
<div id="container"></div>, use JavaScript para adicionar um parágrafo (<p>) com o texto "Parágrafo adicionado" e uma classe "destaque". Em seguida, remova o parágrafo após 3 segundos usandosetTimeout.✓ Resposta:const container = document.getElementById('container'); const paragrafo = document.createElement('p'); paragrafo.textContent = 'Parágrafo adicionado'; paragrafo.classList.add('destaque'); container.appendChild(paragrafo); setTimeout(() => { paragrafo.remove(); }, 3000);