JavaScript Selecionando Elementos do DOM
Aprenda a selecionar elementos do DOM em JavaScript com getElementById, querySelector, querySelectorAll, getElementsByClassName, matches e closest — com exemplos e quando usar cada um.
Antes de alterar qualquer coisa em uma página com JavaScript — atualizar texto, alternar uma classe, adicionar um manipulador de clique — você primeiro precisa encontrar o elemento desejado. Esse ato de encontrar é chamado de seleção de um elemento do DOM. Este capítulo abrange todos os métodos que você precisa, explica o que cada um retorna e mostra quando usar qual.
O que significa "selecionar um elemento"
O Document Object Model (DOM) é a representação viva em formato de árvore que o navegador faz do seu HTML. Cada tag se torna um objeto nó que você pode ler e modificar com JavaScript. Selecionar é o processo de localizar um ou mais desses nós para que você possa manter uma referência a eles em uma variável:
const heading = document.querySelector('h1');
// `heading` now points at the real <h1> on the page.Com essa referência em mãos, tudo o mais — ler atributos e propriedades, alterar estilos, adicionar ouvintes de eventos — funciona sobre ela.
Os métodos de seleção se dividem em dois grupos:
- Buscas por ID / classe / tag — rápidas, retornam coleções vivas (exceto
getElementById). - Buscas por seletor CSS (
querySelector,querySelectorAll) — flexíveis, aceitam qualquer seletor CSS, retornam um resultado estático.
Selecionando um elemento por ID: getElementById
A maneira mais rápida de obter um único elemento é pelo seu id exclusivo. Retorna o elemento ou null se nenhum elemento com esse ID existir.
const element = document.getElementById('example');
element.textContent = 'You selected the element by its ID!';Como os IDs devem ser únicos, getElementById retorna um único elemento (não uma coleção) e é a busca mais direta e com melhor desempenho.
Se nenhum elemento corresponder, getElementById retorna null. Chamar uma propriedade em null lança TypeError: Cannot read properties of null. Proteja-se contra isso: const el = document.getElementById('maybe'); if (el) { /* ... */ }.
Selecionando por nome de classe: getElementsByClassName
Este método retorna uma HTMLCollection viva de todos os elementos que possuem a classe informada. "Viva" significa que a coleção é atualizada automaticamente conforme o DOM muda.
const elements = document.getElementsByClassName('example');
Array.from(elements).forEach((element, index) => {
element.textContent = `Element ${index + 1} changed!`;
});Uma HTMLCollection é semelhante a um array, mas não é um array de verdade, por isso não possui forEach/map. Converta-a com Array.from() (ou spread [...elements]) antes de usar métodos de array.
Como a coleção é viva, iterar com for (let i = 0; i < c.length; i++) enquanto remove elementos correspondentes pode pular itens — o comprimento diminui enquanto você percorre. Tire um instantâneo com Array.from() quando planeja mutar o DOM durante o loop.
Selecionando por nome de tag: getElementsByTagName
Seleciona todos os elementos com um determinado nome de tag e retorna uma HTMLCollection viva.
const paragraphs = document.getElementsByTagName('p');
for (let i = 0; i < paragraphs.length; i++) {
paragraphs[i].style.backgroundColor = 'yellow';
}Passe '*' para corresponder a todos os elementos da página. Isso é útil quando você quer operar em todas as tags de um tipo, como destacar todos os parágrafos.
Selecionando pelo atributo name: getElementsByName
Retorna uma NodeList viva de elementos que compartilham o mesmo atributo name. É mais útil para controles de formulário — por exemplo, todos os botões de rádio em um grupo:
const options = document.getElementsByName('plan');
options.forEach((radio) => {
radio.addEventListener('change', () => {
console.log('Selected plan:', radio.value);
});
});Para um tratamento mais aprofundado de formulários, consulte trabalhando com formulários no DOM.
Selecionando com seletores CSS: querySelector
querySelector retorna o primeiro elemento que corresponde a qualquer seletor CSS que você passar, ou null se nada corresponder. É o método mais versátil para selecionar um único elemento.
const element = document.querySelector('.example');
element.style.backgroundColor = 'lightblue';Como aceita a sintaxe completa de seletores CSS, você pode selecionar elementos profundamente aninhados: querySelector('nav ul li.active a') encontra o primeiro link correspondente sem encadear várias chamadas.
Selecionando todas as correspondências: querySelectorAll
Retorna uma NodeList estática de todos os elementos que correspondem ao seletor. Ao contrário de getElementsBy..., esse instantâneo não é atualizado quando o DOM muda posteriormente.
const elements = document.querySelectorAll('.example');
elements.forEach((element, index) => {
element.style.backgroundColor = 'lightgreen';
element.textContent = `Element ${index + 1} highlighted!`;
});Uma NodeList tem o método forEach nativo, então você pode iterá-la diretamente. Para usar map/filter, converta-a com Array.from(elements) primeiro.
querySelectorAll retorna uma NodeList estática — ela não refletirá elementos adicionados ou removidos posteriormente. getElementsByClassName e getElementsByTagName retornam HTMLCollections vivas que refletem. Escolha estático quando quiser um instantâneo estável, e vivo quando quiser que a coleção acompanhe o DOM.
Restringindo uma busca a um elemento
Todos os métodos querySelector* e getElementsBy* também existem em elementos individuais, não apenas em document. Chamá-los em um elemento restringe a busca aos descendentes desse elemento:
const card = document.querySelector('.card');
const title = card.querySelector('.title'); // only inside .cardRestringir o escopo mantém as consultas rápidas e evita corresponder acidentalmente elementos em outras partes da página.
Testando um elemento: matches
matches não retorna um elemento — retorna true/false indicando se um dado elemento corresponde a um seletor CSS. É ideal dentro de manipuladores de eventos e delegação de eventos.
const element = document.getElementById('test');
if (element.matches('.example')) {
element.style.color = 'red';
element.textContent = 'Element matches the selector!';
}Subindo pela árvore: closest
closest começa no próprio elemento e sobe pelos seus ancestrais, retornando o mais próximo que corresponde ao seletor (ou null). É a maneira mais limpa de encontrar um elemento contêiner.
const element = document.getElementById('child');
const parent = element.closest('.outer');
parent.style.border = '2px solid red';matches + closest são a base da delegação de eventos: adicione um ouvinte a um contêiner e, no manipulador, use event.target.closest('.item') para descobrir qual filho foi clicado. Saiba mais em tratamento de eventos no DOM.
Combinando seletores para uma seleção precisa
Seletores CSS se compõem, então você pode ser tão específico quanto precisar sem código extra:
const element = document.querySelector('.example.special');
element.style.backgroundColor = 'pink';
element.textContent = 'Special element highlighted!';Aqui .example.special corresponde a um elemento que possui ambas as classes. Você pode encadear combinadores (>, espaço descendente, +, ~), seletores de atributo (input[type="email"]) e pseudo-classes (li:first-child).
Qual método devo usar?
| Método | Retorna | Vivo? | Ideal para |
|---|---|---|---|
getElementById | elemento único / null | n/a | um elemento com ID único conhecido |
getElementsByClassName | HTMLCollection | vivo | todos os elementos de uma classe, acompanhando o DOM |
getElementsByTagName | HTMLCollection | vivo | todos os elementos de uma tag |
getElementsByName | NodeList | vivo | controles de formulário que compartilham um name |
querySelector | primeira correspondência / null | n/a | primeiro elemento que corresponda a qualquer seletor CSS |
querySelectorAll | NodeList | estático | um instantâneo estável de todas as correspondências |
matches | boolean | n/a | testar se um elemento corresponde a um seletor |
closest | ancestral mais próximo / null | n/a | encontrar um elemento contêiner |
Regras práticas:
- Use
querySelector/querySelectorAllpor padrão — uma API consistente e todo o poder do CSS. - Use
getElementByIdquando tiver um ID único e quiser a busca mais rápida possível. - Use uma coleção viva (
getElementsBy...) somente quando quiser explicitamente que ela acompanhe as mudanças do DOM; caso contrário, prefira oquerySelectorAllestático.
Armadilhas comuns
- Resultados
null.getElementById,querySelectoreclosestretornamnullquando não há correspondência. Sempre verifique antes de usar o resultado. - Executar antes de o DOM existir. Se seu script rodar no
<head>antes de os elementos serem analisados, as seleções não retornam nada. Coloque scripts no final do<body>, usedeferou aguarde oDOMContentLoaded. - Coleções não são arrays.
HTMLCollectionnão temforEach.NodeListtemforEach, mas não temmap/filter. Converta comArray.from()quando tiver dúvida.
Conclusão
Selecionar elementos é o ponto de entrada para toda tarefa no DOM. Para a maior parte do código, querySelector e querySelectorAll oferecem uma API flexível e poderosa baseada em CSS; getElementById continua sendo a escolha mais rápida para IDs únicos; e matches / closest viabilizam uma delegação de eventos limpa. Depois de conseguir selecionar elementos com confiança, continue com manipulação do DOM e percorrendo o DOM.
Nota de desempenho: Todos esses métodos são suficientemente rápidos para páginas típicas. O custo real vem de executá-los repetidamente em loops fechados — guarde uma seleção em uma variável em vez de fazer a consulta novamente. NodeLists estáticas de querySelectorAll evitam a sobrecarga de reflow que mantém as HTMLCollections vivas atualizadas.