JavaScript

O que Todo Dev Deve Saber sobre DOM em JavaScript: Seleção, Manipulação e Traversal de Elementos

7 min de leitura

O que Todo Dev Deve Saber sobre DOM em JavaScript: Seleção, Manipulação e Traversal de Elementos

Seleção de Elementos no DOM A base de qualquer manipulação do DOM é saber localizar os elementos certos. O JavaScript oferece vários métodos nativos, cada um com seu caso de uso específico. Os métodos mais modernos e eficientes são e , que aceitam qualquer seletor CSS válido. Para casos específicos, você ainda encontrará , e em código legado. A diferença principal é que esses últimos retornam HTMLCollections (dinâmicas) enquanto retorna NodeLists (estáticas), o que é geralmente preferível para evitar comportamentos inesperados durante iterações. Manipulação de Elementos Modificando Conteúdo e Atributos Após selecionar um elemento, você pode modificar seu conteúdo, classes e atributos. As propriedades e são as mais usadas, com a diferença crítica de que interpreta tags HTML enquanto trata tudo como texto puro. Criando e Removendo Elementos Às vezes você precisa gerar novos elementos dinamicamente. O processo envolve criar o elemento, configurá-lo e inserir no DOM. Modificando Estilos Você pode alterar estilos diretamente via propriedade , mas a melhor

<h2>Seleção de Elementos no DOM</h2>

<p>A base de qualquer manipulação do DOM é saber localizar os elementos certos. O JavaScript oferece vários métodos nativos, cada um com seu caso de uso específico. Os métodos mais modernos e eficientes são <code>querySelector()</code> e <code>querySelectorAll()</code>, que aceitam qualquer seletor CSS válido.</p>

<pre><code class="language-javascript">// Seleciona o primeiro elemento que corresponde ao seletor

const titulo = document.querySelector(&#039;h1&#039;);

const botao = document.querySelector(&#039;.btn-primary&#039;);

const campo = document.querySelector(&#039;#email&#039;);

// Seleciona todos os elementos que correspondem

const paragrafos = document.querySelectorAll(&#039;p&#039;);

const itens = document.querySelectorAll(&#039;[data-tipo=&quot;destaque&quot;]&#039;);

// Retorna um NodeList - é possível iterar com forEach

paragrafos.forEach(paragrafo =&gt; {

console.log(paragrafo.textContent);

});</code></pre>

<p>Para casos específicos, você ainda encontrará <code>getElementById()</code>, <code>getElementsByClassName()</code> e <code>getElementsByTagName()</code> em código legado. A diferença principal é que esses últimos retornam HTMLCollections (dinâmicas) enquanto <code>querySelectorAll()</code> retorna NodeLists (estáticas), o que é geralmente preferível para evitar comportamentos inesperados durante iterações.</p>

<h2>Manipulação de Elementos</h2>

<h3>Modificando Conteúdo e Atributos</h3>

<p>Após selecionar um elemento, você pode modificar seu conteúdo, classes e atributos. As propriedades <code>textContent</code> e <code>innerHTML</code> são as mais usadas, com a diferença crítica de que <code>innerHTML</code> interpreta tags HTML enquanto <code>textContent</code> trata tudo como texto puro.</p>

<pre><code class="language-javascript">const elemento = document.querySelector(&#039;.mensagem&#039;);

// Modificar conteúdo (seguro para texto)

elemento.textContent = &#039;Olá, usuário!&#039;;

// Modificar conteúdo com HTML (cuidado com XSS)

elemento.innerHTML = &#039;&lt;strong&gt;Importante:&lt;/strong&gt; Verifique seus dados.&#039;;

// Modificar atributos individuais

elemento.setAttribute(&#039;data-status&#039;, &#039;ativo&#039;);

elemento.id = &#039;msg-principal&#039;;

// Trabalhar com classes

elemento.classList.add(&#039;destaque&#039;);

elemento.classList.remove(&#039;oculto&#039;);

elemento.classList.toggle(&#039;selecionado&#039;);

// Verificar se possui uma classe

if (elemento.classList.contains(&#039;erro&#039;)) {

console.log(&#039;Há um erro neste elemento&#039;);

}</code></pre>

<h3>Criando e Removendo Elementos</h3>

<p>Às vezes você precisa gerar novos elementos dinamicamente. O processo envolve criar o elemento, configurá-lo e inserir no DOM.</p>

<pre><code class="language-javascript">// Criar um novo elemento

const novoItem = document.createElement(&#039;li&#039;);

novoItem.textContent = &#039;Item adicionado dinamicamente&#039;;

novoItem.className = &#039;item-novo&#039;;

// Inserir ao final da lista

const lista = document.querySelector(&#039;ul&#039;);

lista.appendChild(novoItem);

// Inserir em posição específica

const primeiroItem = lista.querySelector(&#039;li&#039;);

lista.insertBefore(novoItem, primeiroItem);

// Remover elementos

novoItem.remove();

// Ou remover via parent

lista.removeChild(novoItem);</code></pre>

<h3>Modificando Estilos</h3>

<p>Você pode alterar estilos diretamente via propriedade <code>style</code>, mas a melhor prática é trabalhar com classes CSS. Ainda assim, há situações onde estilos inline são necessários.</p>

<pre><code class="language-javascript">const caixa = document.querySelector(&#039;.caixa&#039;);

// Modificar estilos inline (use com moderação)

caixa.style.backgroundColor = &#039;#3498db&#039;;

caixa.style.padding = &#039;20px&#039;;

caixa.style.display = &#039;block&#039;;

// Preferível: trabalhar com classes

caixa.classList.add(&#039;ativo&#039;);

// Obter valor computado de um estilo

const corFundo = window.getComputedStyle(caixa).backgroundColor;

console.log(corFundo);</code></pre>

<h2>Traversal e Navegação no DOM</h2>

<h3>Percorrendo a Árvore DOM</h3>

<p>Traversal significa navegar entre elementos relacionados: pais, filhos, irmãos. Isso é essencial quando você precisa acessar elementos de forma relativa em vez de absoluta.</p>

<pre><code class="language-javascript">const elemento = document.querySelector(&#039;.item&#039;);

// Acessar o elemento pai

const pai = elemento.parentElement;

console.log(pai.className);

// Acessar todos os filhos

const filhos = elemento.children; // HTMLCollection

elemento.childNodes; // inclui nós de texto

// Primeiro e último filho

const primeiro = elemento.firstElementChild;

const ultimo = elemento.lastElementChild;

// Elementos irmãos

const proximo = elemento.nextElementSibling;

const anterior = elemento.previousElementSibling;

// Navegar múltiplos níveis

const avô = elemento.parentElement.parentElement;</code></pre>

<h3>Buscas Relativas com querySelector</h3>

<p>Uma técnica poderosa é usar <code>querySelector</code> de forma relativa, começando de um elemento específico em vez de sempre partir do <code>document</code>.</p>

<pre><code class="language-javascript">const formulario = document.querySelector(&#039;form&#039;);

// Buscar elementos dentro do formulário

const emailField = formulario.querySelector(&#039;input[name=&quot;email&quot;]&#039;);

const todos_inputs = formulario.querySelectorAll(&#039;input&#039;);

// Verificar se um elemento contém outro

const campo = formulario.querySelector(&#039;[type=&quot;text&quot;]&#039;);

if (formulario.contains(campo)) {

console.log(&#039;O campo está dentro do formulário&#039;);

}

// Encontrar o elemento pai mais próximo que corresponde a um seletor

const linha = campo.closest(&#039;tr&#039;); // útil para tabelas

const card = campo.closest(&#039;.card&#039;);</code></pre>

<p>O método <code>closest()</code> é extremamente valioso: ele sobe a árvore DOM procurando o primeiro ancestral que corresponde ao seletor. Isso elimina a necessidade de escrever loops manuais para navegação.</p>

<h2>Boas Práticas e Performance</h2>

<p>Acessar o DOM é operação custosa. Minimize queries desnecessárias armazenando referências em variáveis. Ao manipular múltiplos elementos, agrupe as mudanças para evitar reflows contínuos.</p>

<pre><code class="language-javascript"></code></pre>

<h2>Conclusão</h2>

<p>Dominar o DOM é fundamental para qualquer desenvolvedora ou desenvolvedor JavaScript. Os três pilares aprendidos neste artigo são: <strong>(1) seleção eficiente com <code>querySelector</code> e <code>querySelectorAll</code></strong>, que cobrem 95% dos casos reais; <strong>(2) manipulação segura de conteúdo, classes e atributos</strong>, sempre preferindo classes para estilos em vez de estilos inline; e <strong>(3) traversal inteligente usando <code>parentElement</code>, <code>closest()</code> e buscas relativas</strong>, que torna seu código mais flexível e resiliente a mudanças estruturais no HTML.</p>

<p>Com esses conhecimentos e as práticas de performance, você está pronto para construir interfaces dinâmicas e responsivas.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://developer.mozilla.org/pt-BR/docs/Web/API/Document_Object_Model" target="_blank" rel="noopener noreferrer">MDN Web Docs - Document Object Model (DOM)</a></li>

<li><a href="https://developer.mozilla.org/pt-BR/docs/Web/API/Document/querySelector" target="_blank" rel="noopener noreferrer">MDN Web Docs - querySelector</a></li>

<li><a href="https://developer.mozilla.org/pt-BR/docs/Web/API/Element/closest" target="_blank" rel="noopener noreferrer">MDN Web Docs - Element.closest()</a></li>

<li><a href="https://javascript.info/dom-navigation" target="_blank" rel="noopener noreferrer">JavaScript.info - DOM Navigation</a></li>

<li><a href="https://web.dev/dom-size/" target="_blank" rel="noopener noreferrer">Web.dev - DOM Performance</a></li>

</ul>

Comentários

Mais em JavaScript

Guia Completo de Autenticação em Node.js: JWT, Bcrypt e Sessões com Express
Guia Completo de Autenticação em Node.js: JWT, Bcrypt e Sessões com Express

Autenticação em Node.js: JWT, Bcrypt e Sessões com Express Autenticação é o p...

Callbacks em JavaScript: O Padrão Original de Assincronismo: Do Básico ao Avançado
Callbacks em JavaScript: O Padrão Original de Assincronismo: Do Básico ao Avançado

Callbacks em JavaScript: O Padrão Original de Assincronismo O que é um Callba...

Boas Práticas de Variáveis de Ambiente e Configuração em Projetos JavaScript para Times Ágeis
Boas Práticas de Variáveis de Ambiente e Configuração em Projetos JavaScript para Times Ágeis

Introdução: Por Que Variáveis de Ambiente Importam Variáveis de ambiente são...