O evento popstate
Responda à navegação de voltar e avançar do navegador.
O evento popstate é uma aula grátis de HTML Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de HTML Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de HTML Academy inclui 4 aulas no total.
O que faz o evento de navegação no histórico
O evento popstate é disparado na janela quando o usuário navega pelo histórico (para trás, para frente ou por meio de uma chamada JavaScript a history.back). Ele permite que a SPA renderize novamente a visualização correta em resposta à navegação iniciada pelo navegador.
Quando ele é disparado
O evento é disparado ao clicar nos botões Voltar e Avançar, ao chamar history.back(), history.forward() e history.go(n). Ele NÃO é disparado quando pushState/replaceState são chamados manualmente — essas são atualizações programáticas, e a página já tem conhecimento delas.
window.addEventListener("popstate", (e) => {
console.log("Navigated to", location.pathname, "state:", e.state);
renderPage(location.pathname);
});A propriedade de estado
A propriedade state do evento contém o objeto de estado que você passou para pushState/replaceState referente à entrada para a qual a navegação foi feita. Use-a para restaurar o estado da interface (aba aberta, posição de rolagem) que não fica armazenado no endereço.
Ler o novo endereço
A barra de endereço já foi atualizada quando o evento é disparado. Leia location.pathname, location.search e location.hash para encontrar o novo endereço. Junto com o estado, essas são todas as informações necessárias para renderizar a visualização de destino.
Carregamento inicial da página
O evento de navegação no histórico NÃO é disparado no carregamento inicial da página — apenas durante a navegação. Renderize a visualização inicial a partir de location na inicialização e, depois, deixe o evento cuidar das navegações seguintes. Sem isso, a página inicial fica em branco quando a primeira navegação para trás chega.
// Initial render
renderPage(location.pathname);
// Future navigation
window.addEventListener("popstate", () => renderPage(location.pathname));Alteração do fragmento versus navegação no histórico
Para roteamento baseado exclusivamente em fragmentos (endereços como /#/about), o evento hashchange é disparado quando o fragmento muda. O evento de navegação no histórico também é disparado para alterações de caminho. As SPAs modernas usam a API de histórico e esse evento; o roteamento por fragmentos é legado.
Interceptação de cliques
Para fazer um clique comum em <a> disparar uma navegação no cliente, intercepte o clique, chame preventDefault e execute pushState + renderPage. Verifique as teclas modificadoras (clique com Cmd/Ctrl para abrir uma nova aba) e deixe esses cliques seguirem o comportamento padrão.
document.addEventListener("click", (e) => {
const a = e.target.closest("a");
if (!a || a.target || e.metaKey || e.ctrlKey) return;
e.preventDefault();
history.pushState(null, "", a.href);
renderPage(location.pathname);
});Restaurar a posição de rolagem
Os navegadores tentam restaurar automaticamente a posição de rolagem durante a navegação para trás, mas isso não é confiável em SPAs porque o conteúdo é renderizado de forma assíncrona. Salve a rolagem no estado de pushState e restaure-a durante a navegação no histórico: window.scrollTo(0, e.state?.scroll ?? 0).
ressalva da renderização assíncrona
Se renderPage buscar dados de forma assíncrona, o endereço será atualizado antes de o conteúdo chegar. Mostre um estado de carregamento e depois renderize. Evite condições de corrida nas quais o usuário clica em Voltar durante uma busca e o resultado da busca cancelada sobrescreve a nova visualização.
Roteadores de estruturas
React Router, Vue Router e o roteador do SvelteKit envolvem a API de histórico e o evento de navegação no histórico. Mesmo sem uma estrutura, o mecanismo subjacente é o mesmo — escutar o evento, interceptar links e chamar pushState. Quando a sobrecarga for importante, crie seu próprio roteador em cerca de 50 linhas de JavaScript puro.
Armadilha comum: vazamentos de memória
A configuração de cada visualização pode anexar ouvintes de eventos e temporizadores. Sem uma desmontagem explícita quando a visualização muda (durante a navegação no histórico ou no invólucro de pushState), os ouvintes se acumulam e degradam o desempenho ao longo do tempo. Acompanhe as inscrições de cada visualização com um AbortController e aborte-as quando a visualização mudar.
Verificação de conhecimento
Por que o evento de navegação no histórico NÃO é disparado quando você chama history.pushState por conta própria?
Resumo
O evento de navegação no histórico é disparado durante a navegação para trás ou para frente do navegador, dando acesso ao estado salvo e à nova localização. Ele não é disparado por pushState/replaceState (seu código já sabe o que fez) nem no carregamento inicial da página (renderize manualmente). Intercepte cliques em links para a navegação de SPA, salve a posição de rolagem no estado e desmonte os ouvintes quando a visualização mudar para evitar vazamentos.
Perguntas Frequentes
A aula “O evento popstate” é grátis?
Sim — o texto completo de “O evento popstate” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de HTML Academy, atualize para CoddyKit PRO. O curso de HTML Academy inclui 4 aulas no total.
O que vou aprender em “O evento popstate”?
Responda à navegação de voltar e avançar do navegador. Você pratica HTML Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar HTML Academy?
Nenhuma experiência prévia é necessária. HTML Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “O evento popstate”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de HTML Academy?
Sim. Cada aula de HTML Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- pushState e replaceState
- O evento popstate
- Roteamento baseado em hash versus baseado em caminho
- A API Navigation em navegadores modernos