Existe uma maneira de pegar o evento de botão de volta em javascript?

Existe uma maneira de responder ao botão Voltar sendo pressionado (ou backspace sendo pressionado) em javascript quando apenas o hash de local muda? Isto é, quando o navegador não está se comunicando com o servidor ou recarregando a página.

Use o evento hashchange :

 window.addEventListener("hashchange", function(e) { // ... }) 

Se você precisar oferecer suporte a navegadores mais antigos, confira a seção Evento hashChange na página wiki Polyfills do navegador HTML5 do Modernizr.

Eu criei uma solução que pode ser útil para algumas pessoas. Basta include o código em sua página e você pode escrever sua própria function que será chamada quando o botão Voltar for clicado.

Eu testei no IE, FF, Chrome e Safari, e estão todos funcionando. A solução que tenho funciona com base em iframes sem a necessidade de pesquisa constante, no IE e FF, no entanto, devido a limitações em outros navegadores, o hash de localização é usado no Safari.

Eu fiz um truque divertido para resolver este problema para minha satisfação. Eu tenho um site AJAX que carrega conteúdo dinamicamente, em seguida, modifica o window.location.hash e eu tinha código para ser executado em $ (document) .ready () para analisar o hash e carregar a seção apropriada. A questão é que eu estava perfeitamente feliz com o código de carregamento da minha seção para navegação, mas queria adicionar uma maneira de interceptar os botões voltar e avançar do navegador, que mudam o local da janela, mas não interfere nas minhas rotinas atuais de carregamento de página onde manipulo window.location, e sondando o window.location em intervalos constantes estava fora de questão.

O que acabei fazendo foi criar um object como tal:

 var pageload = { ignorehashchange: false, loadUrl: function(){ if (pageload.ignorehashchange == false){ //code to parse window.location.hash and load content }; } }; 

Em seguida, adicionei uma linha ao script do meu site para executar a function pageload.loadUrl no evento hashchange , como:

 window.addEventListener("hashchange", pageload.loadUrl, false); 

Então, toda vez que eu quiser modificar o window.location.hash sem acionar esta rotina de carregamento de página, eu simplesmente adiciono a seguinte linha antes de cada window.location.hash = line:

 pageload.ignorehashchange = true; 

e depois a seguinte linha após cada linha de modificação de hash:

 setTimeout(function(){pageload.ignorehashchange = false;}, 100); 

Portanto, agora minhas rotinas de carregamento de seção geralmente estão em execução, mas se o usuário pressionar os botões ‘voltar’ ou ‘avançar’, o novo local será analisado e a seção apropriada carregada.

Confira o history.js . Existe um evento de 5 estados da linguagem html e você pode ouvi-lo.

Você deu uma olhada nisso? http://developer.yahoo.com/yui/history/

onLocationChange também pode ser útil. Não tenho certeza se isso é apenas uma coisa do Mozilla, parece que pode ser.