Estou usando o Ajax e o hash para navegação.
Existe uma maneira de verificar se o window.location.hash
mudou assim?
http://example.com/blah # 123 a http://example.com/blah # 456
Funciona se eu verificar quando o documento for carregado.
Mas se eu tiver a navegação com #hash, ela não funcionará quando pressiono o botão Voltar no navegador (então pulo de blá # 456 para blá # 123).
Ele aparece dentro da caixa de endereço, mas não consigo pegá-lo com JavaScript.
Respostas:
A única maneira de realmente fazer isso (e é como a 'história realmente simples' faz isso) é definindo um intervalo que continua verificando o hash atual e comparando-o com o que era antes, fazemos isso e permitimos que os assinantes assinem uma alteração evento que disparamos se o hash mudar .. não é perfeito, mas os navegadores realmente não suportam esse evento nativamente.
Atualize para manter esta resposta atualizada:
Se você estiver usando o jQuery (que hoje deve ser um pouco fundamental para a maioria), uma boa solução é usar a abstração que o jQuery fornecer, usando seu sistema de eventos para ouvir eventos de alteração de hash no objeto da janela.
O bom aqui é que você pode escrever um código que nem precisa se preocupar com o suporte à mudança de hash, no entanto, você precisa fazer alguma mágica, na forma de um recurso jQuery um pouco menos conhecido, eventos especiais do jQuery .
Com esse recurso, você basicamente executa algum código de configuração para qualquer evento, a primeira vez que alguém tenta usar o evento de qualquer maneira (como vincular ao evento).
Nesse código de configuração, você pode verificar o suporte nativo ao navegador e, se o navegador não implementar isso nativamente, você pode configurar um cronômetro único para pesquisar alterações e acionar o evento jQuery.
Isso desvincula completamente seu código da necessidade de entender esse problema de suporte; a implementação de um evento especial desse tipo é trivial (para obter uma versão funcional simples de 98%), mas por que fazer isso quando outra pessoa já o fez .
fonte
hashchange
evento, enquanto o Safari (estável) ainda não.hashchange
evento é agora amplamente suportado: caniuse.com/#search=hashHTML5 especifica um
hashchange
evento . Agora, este evento é suportado por todos os navegadores modernos . Foi adicionado suporte nas seguintes versões do navegador:fonte
window.onhashchange = function() { doYourStuff(); }
Observe que, no caso do Internet Explorer 7 e Internet Explorer 9, a
if
declaração será verdadeira (para "onhashchange" no Windows), maswindow.onhashchange
nunca será acionada; portanto, é melhor armazenar o hash e verificá-lo após cada 100 milissegundos, independentemente de ter sido alterado ou não. para todas as versões do Internet Explorer.EDIT - Desde jQuery 1.9,
$.browser.msie
não é suportado. Fonte: http://api.jquery.com/jquery.browser/fonte
Existem muitos truques para lidar com o History e o window.location.hash nos navegadores IE:
Como disse a pergunta original, se você passa da página a.html # b para a.html # c e pressiona o botão Voltar, o navegador não sabe que a página foi alterada. Deixe-me dizer um exemplo: window.location.href será 'a.html # c', não importa se você está em a.html # b ou a.html # c.
Na verdade, a.html # be a.html # c são armazenados no histórico apenas se os elementos '<a name="#b">' e '<a name="#c">' existirem anteriormente na página.
No entanto, se você colocar um iframe em uma página, navegue de a.html # b para a.html # c nesse iframe e pressione o botão voltar, iframe.contentWindow.document.location.href será alterado conforme o esperado.
Se você usar 'document.domain = something ' no seu código, não poderá acessar iframe.contentWindow.document.open () '(e muitos gerenciadores de história fazem isso)
Sei que essa não é uma resposta real, mas talvez as anotações do IE-History sejam úteis para alguém.
fonte
O Firefox tem um evento onhashchange desde 3.6. Consulte window.onhashchange .
fonte
Ben Alman tem um ótimo plugin jQuery para lidar com isso: http://benalman.com/projects/jquery-hashchange-plugin/
Se você não estiver usando o jQuery, pode ser uma referência interessante para dissecar.
fonte
Você pode implementar facilmente um observador (o método "watch") na propriedade "hash" do objeto "window.location".
O Firefox tem sua própria implementação para observar alterações de objeto , mas se você usar alguma outra implementação (como Observar alterações nas propriedades do objeto em JavaScript ) - para outros navegadores, isso fará o truque.
O código ficará assim:
Então você pode testá-lo:
E é claro que isso ativará sua função de observador.
fonte
watch
ao objeto que possui a propriedade que está sendo alterada e deseja observá-lo.Eu estava usando isso em um aplicativo de reação para fazer a URL exibir parâmetros diferentes, dependendo da exibição do usuário.
Eu assisti o parâmetro hash usando
Então
Trabalhou um tratamento, trabalha com os botões de avançar e voltar do navegador e também no histórico do navegador.
fonte
addEventListener
chamada, você deve remover o arquivo()
dedoSomethingWithChangeFunction
()
. AaddEventListener
função requer que você passe uma função.doSomethingWithChangeFunction
é uma função.doSomethingWithChangeFunction()
é o valor de retorno dessa função, que neste caso não é uma função.Uma implementação decente pode ser encontrada em http://code.google.com/p/reallysimplehistory/ . O único (mas também) problema e bug que ele possui é: no Internet Explorer, a modificação manual do hash do local redefinirá toda a pilha de histórico (esse é um problema do navegador e não pode ser resolvido).
Observe que o Internet Explorer 8 tem suporte para o evento "hashchange" e, como ele se torna parte do HTML5, você pode esperar que outros navegadores os atualizem.
fonte
Outra ótima implementação é o jQuery History, que usará o evento onhashchange nativo se for suportado pelo navegador; caso contrário, usará um iframe ou intervalo apropriado para o navegador para garantir que toda a funcionalidade esperada seja emulada com êxito. Ele também fornece uma interface agradável para vincular a determinados estados.
Outro projeto digno de nota também é o jQuery Ajaxy, que é praticamente uma extensão do jQuery History para adicionar ajax ao mix. Como quando você começa a usar ajax com hashes, fica muito complicado !
fonte
É isso aí ... agora, sempre que você pressionar os botões voltar ou avançar, a página será recarregada conforme o novo valor de hash.
fonte
Eu tenho usado path.js para o meu roteamento do lado do cliente. Descobri que é bastante sucinto e leve (também foi publicado no NPM também) e faz uso da navegação baseada em hash.
path.js NPM
path.js GitHub
fonte
Eu usei um plugin do jQuery, o HUtil , e escrevi uma interface do tipo YUI History sobre ela.
Confira uma vez. Se você precisar de ajuda, eu posso ajudar.
fonte