Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Ao lidar com navegação de usuários em páginas web, uma das questões mais comuns é entender a intenção deles ao tentar sair de uma página que possui dados não salvos. O evento nativo do JavaScript, onbeforeunload, permite exibir uma caixa de diálogo de confirmação, mas sua limitação principal é que não há uma maneira direta de detectar se o usuário clicou em Cancelar ou Confirmar. Vamos explorar o problema, as alternativas e boas práticas para lidar com essa situação.
O evento onbeforeunload é disparado quando o usuário tenta fechar a aba, navegar para outro site ou recarregar a página. Sua principal vantagem é que permite apresentar uma mensagem personalizada, alertando sobre dados não salvos. Porém, o padrão é que o navegador exiba uma caixa de diálogo de confirmação, cuja mensagem costuma ser controlada pelo próprio navegador por motivos de segurança. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
O desafio é que, durante esse evento, não há um callback ou evento que indique se o usuário clicou em Cancelar (não quer sair) ou Confirmar (quer sair). Além disso, por padrão, o navegador apenas exibe uma mensagem genérica, sem suporte para mensagens customizadas em muitos navegadores atuais.
Para compreender se o usuário realmente clicou em Cancelar, é preciso pensar além do evento onbeforeunload. Como o evento não fornece essa informação, uma estratégia comum é combinar o uso de variáveis de estado em JavaScript para tentar inferir a intenção.
Por exemplo, pode-se definir uma flag que é setada quando o usuário realiza uma ação de navegação interna, como clicar em um botão de 'Salvar' ou 'Cancelar' em uma interface customizada. Assim, na hora do evento onbeforeunload, verifica-se essa flag. Se ela indicar que o usuário clicou em 'Cancelar' na sua própria interface, você pode agir de acordo. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Porém, essa abordagem tem limitações: ela não captura o clique na caixa de diálogo padrão do navegador, apenas ações internas ao seu app.
Uma estratégia prática é criar uma variável de controle que indique o estado da navegação. Por exemplo: A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
let navegaParaOutraPagina = false. // Quando o usuário clica em um botão de navegação
document.querySelector('#botao-salvar').addEventListener('click', () => {
// Salva os dados
salvarDados(). // Indica que o usuário quer sair
navegaParaOutraPagina = true. // Redireciona
window.location.href = 'pagina-destino.html'. }). // Evento onbeforeunload
window.addEventListener('beforeunload', (event) => {
if (!navegaParaOutraPagina) {
event.preventDefault(). event.returnValue = 'Você tem alterações não salvas. Sair assim mesmo?'. }
}).
Neste exemplo, o evento only dispara o aviso se a navegação não foi uma ação interna controlada. Assim, é possível evitar o popup padrão em navegações planejadas, e alertar o usuário nas ações externas. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
Apesar de ser uma solução comum, ela não detecta o clique em Cancelar na caixa de diálogo padrão do navegador. Essa interação é gerenciada pelo próprio navegador, sem possibilidade de customização ou detecção de retorno. Além disso, o uso excessivo de eventos de aviso pode gerar frustração e impactar a experiência do usuário. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
Uma alternativa mais avançada é implementar uma camada de confirmação personalizada, usando modais em vez do evento onbeforeunload. Assim, você controla a interação, captura a decisão do usuário e faz o que for necessário, sem depender do comportamento padrão do navegador. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
1. Use variáveis de controle internas para distinguir ações internas de navegação do usuário.
2. Substitua ou complemente o onbeforeunload por modais de confirmação customizados, quando possível.
3. Documente claramente o fluxo de navegação e as ações que resetam o estado interno.
4. Teste em diferentes navegadores, pois o comportamento do onbeforeunload varia bastante.
5. Avalie o impacto na UX: evite alertas excessivos, prefira mensagens claras e ações diretas.
Concluindo, detectar exatamente se o usuário clicou em Cancelar na caixa do navegador não é possível via API padrão. A melhor prática é gerenciar o estado da navegação com variáveis internas e, sempre que possível, usar soluções personalizadas de confirmação. Assim, você garante uma experiência mais controlada e previsível para quem usa seu sistema. A decisão fica mais saudável quando o time consegue medir o impacto depois. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Carregando comentários...