Como você detecta definitivamente se o usuário pressionou ou não o botão Voltar no navegador?
Como você reforça o uso de um botão voltar na página dentro de um aplicativo Web de página única usando um #URL
sistema?
Por que diabos os botões de retorno do navegador não acionam seus próprios eventos !?
Respostas:
(Observação: conforme o feedback de Sharky, incluímos código para detectar backspaces)
Então, eu já vi essas perguntas frequentemente no SO e recentemente me deparei com a questão de controlar a funcionalidade do botão Voltar. Depois de alguns dias procurando a melhor solução para meu aplicativo (página única com navegação Hash), criei um sistema simples, sem navegador, sem biblioteca para detectar o botão voltar.
A maioria das pessoas recomenda o uso de:
No entanto, essa função também será chamada quando um usuário usar no elemento in-page que altera o hash do local. Não é a melhor experiência do usuário quando o usuário clica e a página retrocede ou avança.
Para dar uma visão geral do meu sistema, estou preenchendo uma matriz com hashes anteriores à medida que meu usuário se move pela interface. Parece algo como isto:
Bem direto. Faço isso para garantir o suporte entre navegadores e para navegadores mais antigos. Simplesmente passe o novo hash para a função, que será armazenada para você e depois altere o hash (que é colocado no histórico do navegador).
Também utilizo um botão voltar na página que move o usuário entre as páginas usando a
lasthash
matriz. Se parece com isso:Portanto, isso fará com que o usuário volte ao último hash e remova esse último hash da matriz (não tenho botão de avanço no momento).
Assim. Como detecto se um usuário usou ou não o botão voltar da página ou o botão do navegador?
No começo, olhei
window.onbeforeunload
, mas sem sucesso - isso só é chamado se o usuário mudar de página. Isso não acontece em um aplicativo de página única usando a navegação por hash.Então, depois de mais algumas pesquisas, vi recomendações para tentar definir uma variável de flag. O problema com isso no meu caso é que eu tentaria defini-lo, mas como tudo é assíncrono, nem sempre seria definido a tempo para a instrução if na alteração de hash.
.onMouseDown
nem sempre era chamado em clique, e adicioná-lo a um onclick nunca o acionava com rapidez suficiente.Foi quando comecei a olhar para a diferença entre
document
, ewindow
. Minha solução final foi definir o sinalizador usandodocument.onmouseover
e desativá-lo usandodocument.onmouseleave
.O que acontece é que, enquanto o mouse do usuário está dentro da área do documento (leia-se: a página renderizada, mas excluindo o quadro do navegador), meu booleano está definido como
true
. Assim que o mouse sai da área do documento, o booleano muda parafalse
.Dessa forma, eu posso mudar meu
window.onhashchange
para:Você observará a verificação
#undefined
. Isso ocorre porque, se não houver histórico disponível na minha matriz, ele retornaráundefined
. Eu uso isso para perguntar ao usuário se ele deseja sair usando umwindow.onbeforeunload
evento.Portanto, para resumir, e para pessoas que não estão necessariamente usando um botão voltar da página ou uma matriz para armazenar o histórico:
E aí está. uma maneira simples e em três partes de detectar o uso do botão voltar versus elementos da página no que diz respeito à navegação por hash.
EDITAR:
Para garantir que o usuário não use backspace para acionar o evento back, você também pode incluir o seguinte (obrigado a @thetoolman nesta pergunta ):
fonte
Você pode tentar o
popstate
manipulador de eventos, por exemplo:Nota: Para obter os melhores resultados, você deve carregar esse código apenas em páginas específicas nas quais deseja implementar a lógica para evitar outros problemas inesperados.
O evento popstate é acionado sempre que a entrada do histórico atual é alterada (o usuário navega para um novo estado). Isso acontece quando o usuário clica em Voltar Avançar botões do navegador / ou quando
history.back()
,history.forward()
,history.go()
métodos são programaticamente chamado.A
event.state
propriedade is do evento é igual ao objeto de estado do histórico.Para a sintaxe do jQuery, envolva-a (para adicionar um ouvinte uniforme depois que o documento estiver pronto):
Consulte também: window.onpopstate no carregamento da página
Veja também os exemplos na página pushState de aplicativos de página única e HTML5 :
Isso deve ser compatível com Chrome 5+, Firefox 4+, IE 10+, Safari 6+, Opera 11.5+ e similares.
fonte
Eu estava lutando com esse requisito há um bom tempo e aproveitei algumas das soluções acima para implementá-lo. No entanto, deparei-me com uma observação e parece funcionar nos navegadores Chrome, Firefox e Safari + Android e iPhone
No carregamento da página:
Avise-me se isso ajudar. Se estiver faltando alguma coisa, ficarei feliz em entender.
fonte
event
tem valor mesmo para o botão de avançoEm javascript, tipo de navegação
2
significa clicar no botão voltar ou avançar do navegador e o navegador está realmente retirando o conteúdo do cache.fonte
Definitivamente funcionará (para detectar o clique no botão Voltar)
fonte
Veja isso:
Funciona bem...
fonte
Esta é a única solução que funcionou para mim (não é um site de uma página). Está trabalhando com Chrome, Firefox e Safari.
fonte
A resposta correta já está lá para responder à pergunta. Quero mencionar a nova API JavaScript PerformanceNavigationTiming , que está substituindo o desempenho descontinuado . .
O código a seguir fará o login no console "back_forward" se o usuário chegar à sua página usando o botão voltar ou avançar. Dê uma olhada na tabela de compatibilidade antes de usá-la em seu projeto.
fonte
Navegador: https://jsfiddle.net/Limitlessisa/axt1Lqoz/
Para controle móvel: https://jsfiddle.net/Limitlessisa/axt1Lqoz/show/
fonte
Aqui está a minha opinião. A suposição é que, quando o URL muda, mas não há clique no
document
detectado, é um navegador de volta (sim ou encaminhamento). Um clique do usuário é redefinido após 2 segundos para fazer isso funcionar em páginas que carregam conteúdo via Ajax:fonte
Consegui usar algumas das respostas neste tópico e outras para fazê-lo funcionar no IE e no Chrome / Edge. history.pushState para mim não era suportado no IE11.
fonte
Um componente completo pode ser implementado apenas se você redefinir a API (alterar os métodos do objeto 'history'). Compartilharemos a classe que acabamos de escrever. Testado no Chrome e Mozilla Suporta apenas HTML5 e ECMAScript5-6
fonte
O document.mouseover não funciona para o IE e o FireFox. No entanto, eu tentei isso:
Isso funciona para o Chrome e o IE e não o FireFox. Ainda trabalhando para acertar o FireFox. Qualquer maneira fácil de detectar o clique no botão voltar / avançar do navegador é bem-vinda, não particularmente no JQuery, mas também no AngularJS ou no Javascript simples.
fonte
O código acima funcionou para mim. Nos navegadores móveis, quando o usuário clicava no botão Voltar, queríamos restaurar o estado da página conforme sua visita anterior.
fonte
Eu o resolvi acompanhando o evento original que acionava o
hashchange
(seja um toque, um clique ou uma roda), para que o evento não fosse confundido com uma simples aterrissagem na página e usando uma sinalização adicional em cada uma das minhas ligações de eventos. O navegador não definirá novamente o sinalizador aofalse
pressionar o botão Voltar:fonte
Eu tentei as opções acima, mas nenhuma delas está funcionando para mim. Aqui está a solução
Consulte este link http://www.codeproject.com/Articles/696526/Solution-to-Browser-Back-Button-Click-Event-Handli para obter mais detalhes
fonte