Como posso escrever o código de retorno de chamada JavaScript que será executado em qualquer alteração na âncora do URL?
Por exemplo de http://example.com#a
ahttp://example.com#b
fonte
Como posso escrever o código de retorno de chamada JavaScript que será executado em qualquer alteração na âncora do URL?
Por exemplo de http://example.com#a
ahttp://example.com#b
Os Mecanismos de pesquisa personalizados do Google usam um cronômetro para verificar o hash em relação a um valor anterior, enquanto o iframe filho em um domínio separado atualiza o hash de localização do pai para conter o tamanho do corpo do documento do iframe. Quando o cronômetro detecta a alteração, o pai pode redimensionar o iframe para corresponder ao do corpo, de forma que as barras de rolagem não sejam exibidas.
Algo como o seguinte atinge o mesmo:
var storedHash = window.location.hash;
window.setInterval(function () {
if (window.location.hash != storedHash) {
storedHash = window.location.hash;
hashChanged(storedHash);
}
}, 100); // Google uses 100ms intervals I think, might be lower
Google Chrome 5, Safari 5, Opera 10.60 , Firefox 3.6 e Internet Explorer 8 todo o apoio do hashchange
evento:
if ("onhashchange" in window) // does the browser support the hashchange event?
window.onhashchange = function () {
hashChanged(window.location.hash);
}
e juntando tudo:
if ("onhashchange" in window) { // event supported?
window.onhashchange = function () {
hashChanged(window.location.hash);
}
}
else { // event not supported:
var storedHash = window.location.hash;
window.setInterval(function () {
if (window.location.hash != storedHash) {
storedHash = window.location.hash;
hashChanged(storedHash);
}
}, 100);
}
jQuery também tem um plugin que irá verificar o evento hashchange e fornecer o seu próprio, se necessário - http://benalman.com/projects/jquery-hashchange-plugin/ .
EDIT : Atualizado suporte do navegador (novamente).
var storedHash = window.location.hash;
ao bloco de resumo de junção. Btw: Hoje em dia isso é chamado de polyfill, eu acho.hashChange
emwindow
stackoverflow.com/questions/6390341/how-to-detect-url-changehashChanged(storedHash);
hashChanged
neste caso, pretende ser uma função implementada por um desenvolvedor usando este código. A resposta aqui apenas demonstra como é possível monitorar o hash em busca de alterações onde oonhashchange
evento não está disponível e combina as abordagens baseadas em eventos e temporizadas para fornecer uma solução universal. Meu ponto é que a resposta que você vinculou não adiciona absolutamente nada à resposta aqui ;-). Eles fornecem as mesmas informações básicas, até mesmo o link para o plugin jQuery de Ben Alman. A única diferença é que forneci uma solução JS pura em minha resposta.setInterval()
é a única solução universal por enquanto. Mas há alguma luz no futuro na forma de evento hashchangefonte
onhashchange
do evento na Mozilla Developer NetworkEu recomendaria usar em
addEventListener
vez de substituirwindow.onhashchange
, caso contrário, você bloqueará o evento para outros plug-ins.Olhando para o uso global do navegador hoje, um fallback não é mais necessário.
fonte
Pelo que vejo em outras perguntas do SO, a única solução viável entre navegadores é um cronômetro. Confira esta pergunta por exemplo.
fonte
(Apenas para registro.) O evento sintético "hashchange" YUI3 faz mais ou menos a mesma coisa que a resposta aceita
fonte
Você pode obter mais informações deste
Tipos de evento de mutação
fonte