O DOM

Seu arquivo HTML carrega uma vez, e então a página fica lá. Mas uma caixa de pesquisa que sugere resultados conforme você digita, um menu que abre ao clicar, um contador que aumenta, nada disso está no arquivo HTML. Algo muda o que aparece na página depois que ela carregou, e esse algo é JavaScript chegando até a página através do DOM. Este capítulo é sobre esse alcance: como JavaScript encontra as partes de uma página e as muda para que a página se atualize diante do leitor.
O que é o DOM
Quando o navegador carrega sua página, ele lê seu HTML e constrói uma árvore de objetos a partir dele: um objeto para a página, um para o <body>, um para cada heading, parágrafo e botão dentro. Essa árvore é o DOM, abreviação de Document Object Model. Seu JavaScript pode ler essa árvore e mudá-la, e quando faz isso, a página que você vê se atualiza imediatamente.
A parte que vale a pena guardar: o DOM não é seu arquivo HTML. É a versão viva da página, sentada na memória do navegador. Seu arquivo .html é a receita inicial; o DOM é o prato acabado que o navegador está servindo, e JavaScript pode reorganizar o prato enquanto todos ainda estão comendo.
Cada elemento no DOM é um objeto, do mesmo tipo que você conheceu em objects, com propriedades que você pode ler e mudar. Esse é o truque inteiro: como a página é objetos, e você já sabe trabalhar com objetos, mudar a página é mudar propriedades de objeto.
Selecionando elementos
Antes de poder mudar um elemento, você tem que encontrá-lo na árvore. Você aponta para ele do mesmo jeito que CSS faz, com um seletor, e o navegador entrega a você o objeto correspondente.
O workhorse é document.querySelector. Você o alimenta com um seletor CSS, o mesmo tipo de padrão que você usa em CSS, e ele retorna o primeiro elemento que corresponde:
const card = document.querySelector(".card"); // primeiro elemento com class="card"
const total = document.querySelector("#total"); // o elemento com id="total".card corresponde pela classe, #total corresponde pela id, e uma palavra simples como "button" corresponde pelo nome da tag. querySelector dá a você a primeira correspondência e para por aí. Quando você quer cada correspondência em vez disso, use querySelectorAll, que retorna uma lista que você pode percorrer:
const cards = document.querySelectorAll(".card"); // todos os elementos com class="card"
console.log(cards.length); // quantos encontrouSe nada corresponder, querySelector retorna null, que é a forma do JavaScript de dizer "não há nada aqui".
document.querySelector um seletor CSS como .card ou #total, e ele lhe dá a primeira correspondência. Use querySelectorAll quando você quer todas como uma lista. Se nada corresponder você obtém null, que significa "nada aqui". Lendo e mudando elementos
Uma vez que você tem um elemento, você o lê e muda através de suas propriedades, do mesmo jeito que lê e muda qualquer objeto. É aqui que a página realmente começa a se mover.
A propriedade que você mais usará é textContent, o texto dentro de um elemento. Você pode ler ou definir:
const total = document.querySelector("#total");
total.textContent = "42 items"; // a página agora mostra "42 items"Para mudar como algo se parece, você geralmente adiciona ou remove uma classe e deixa CSS fazer o estilo. classList tem três métodos para isso:
const card = document.querySelector(".card");
card.classList.add("selected"); // adiciona uma classe
card.classList.remove("selected"); // tira dela
card.classList.toggle("selected"); // adiciona se falta, remove se presenteVocê também pode definir um estilo único diretamente através de .style, e definir um atributo como src ou href com setAttribute:
card.style.color = "crimson"; // um estilo inline
const avatar = document.querySelector(".avatar");
avatar.setAttribute("src", "priya.jpg"); // define a fonte da imagemBusque classList primeiro e .style apenas para ajustes pontuais, porque manter seu estilo em CSS o mantém em um lugar.
textContent, e mude sua aparência adicionando ou removendo uma classe com classList.add, remove e toggle. Use .style para um ajuste pontual e setAttribute para coisas como uma fonte de imagem. Dependa de classes para que seu estilo permaneça em seu CSS. Criando e removendo elementos
Mudar elementos que já existem o leva longe, mas às vezes não há nada lá ainda: um para-fazer que você está adicionando, um resultado de pesquisa chegando. Para isso você constrói novos elementos e os coloca na árvore, e tira os antigos.
Você faz um novo elemento com document.createElement, dá a ele algum conteúdo, então o adiciona à página com append:
const list = document.querySelector(".todo-list");
const item = document.createElement("li"); // um novo <li>, não na página ainda
item.textContent = "Comprar leite de aveia"; // dê a ele algum texto
list.append(item); // agora aparece, no final da listaUm novo elemento de createElement existe apenas em memória até você append ele em algum lugar; esse é o passo que o coloca na página. Para tirar um elemento da página, chame remove nele:
item.remove(); // sumiu da páginadocument.createElement, dê a ele texto com textContent, e coloque-o na página com append. Um elemento fresco vive apenas em memória até você anexá-lo, então esse passo é o que o faz aparecer. Para tirar um da página, chame remove nele. Para onde o DOM vai daqui
Selecionar, ler, mudar, criar e remover cobrem a maioria do que JavaScript faz em uma página, e tudo isso é o mesmo movimento por baixo: encontrar um objeto na árvore e mudar suas propriedades. Porque o DOM é objetos, tudo que você aprendeu em objects se aplica diretamente aqui, e o pequeno conjunto de métodos neste capítulo (querySelector, textContent, classList, createElement, append) é a maioria do kit de ferramentas.
O que falta até agora é timing. Cada exemplo aqui roda uma vez, de cima para baixo, mas uma página real muda em resposta ao que o leitor faz: um clique, uma digitação, um formulário enviado. Conectar suas mudanças de DOM a esses momentos é events, o próximo capítulo, onde addEventListener conecta "o usuário fez isso" a "então a página faz aquilo". Uma vez que selecionar e mudar se sentam ao lado de responder a eventos, você pode construir as páginas interativas para as quais o resto deste handbook é direcionado.

