Como posso verificar se um URL foi alterado em JavaScript? Por exemplo, sites como o GitHub, que usam AJAX, acrescentam informações da página após um símbolo # para criar um URL exclusivo sem recarregar a página. Qual é a melhor maneira de detectar se esse URL é alterado?
- O
onload
evento é chamado novamente? - Existe um manipulador de eventos para o URL?
- Ou o URL deve ser verificado a cada segundo para detectar uma alteração?
javascript
ajax
AJ00200
fonte
fonte
Respostas:
Nos navegadores modernos (IE8 +, FF3.6 +, Chrome), você pode apenas ouvir o
hashchange
eventowindow
.Em alguns navegadores antigos, você precisa de um timer que verifique continuamente
location.hash
. Se você estiver usando jQuery, existe um plugin que faz exatamente isso.fonte
beforeunload
evento. Se o seu código iniciou a alteração do URL, ele sabe melhor.Eu queria poder adicionar
locationchange
ouvintes de eventos. Após a modificação abaixo, poderemos fazer isso, assimPor outro lado,
window.addEventListener('hashchange',()=>{})
seria acionado apenas se a parte após uma hashtag em uma URL mudar ewindow.addEventListener('popstate',()=>{})
nem sempre funcionar.Essa modificação, semelhante à resposta de Christian , modifica o objeto de história para adicionar algumas funcionalidades.
Por padrão, há um
popstate
evento, mas não há eventos parapushstate
, ereplacestate
.Isso modifica essas três funções para que todos disparem um
locationchange
evento personalizado para você usar, e tambémpushstate
ereplacestate
eventos se você quiser usá-los:fonte
use este código
com jQuery
fonte
EDITAR depois de um pouco de pesquisa:
De alguma forma, parece que fui enganado pela documentação presente nos documentos do Mozilla. O
popstate
evento (e sua função de retorno de chamadaonpopstate
) não é acionado sempre que opushState()
oureplaceState()
é chamado no código. Portanto, a resposta original não se aplica a todos os casos.No entanto, existe uma maneira de contornar isso fazendo o patch de macaco das funções de acordo com @ alpha123 :
Resposta original
Dado que o título desta pergunta é " Como detectar alterações na URL ", a resposta, quando você deseja saber quando o caminho completo é alterado (e não apenas a âncora de hash), é que você pode ouvir o
popstate
evento:Referência para popstate no Mozilla Docs
Atualmente (janeiro de 2017), há suporte para o popstate em 92% dos navegadores em todo o mundo.
fonte
Com jquery (e um plug-in), você pode fazer
http://benalman.com/projects/jquery-hashchange-plugin/
Caso contrário, sim, você precisaria usar setInterval e verificar uma alteração no evento de hash (window.location.hash)
Atualizar! Um rascunho simples
fonte
window.addEventListener("hashchange", hashChanged);
detect()
função?Adicione um ouvinte de evento de alteração de hash!
Ou, para ouvir todas as alterações de URL:
Isso é melhor do que algo como o código abaixo, porque apenas uma coisa pode existir em window.onhashchange e você possivelmente substituirá o código de outra pessoa.
fonte
esta solução funcionou para mim:
fonte
setInterval
parasetTimeout
: "usar setInterval () interromperá o navegador depois de um tempo, porque criará uma nova chamada para verificarURLchange () a cada segundo. setTimeout () é a solução correta, porque é chamada apenas uma vez ".setTimeout
como sugere o @divibisan, mova a partesetInterval
externa da função.checkURLchange();
também se torna opcional.Embora seja uma pergunta antiga, o projeto da barra de localização é muito útil.
fonte
Para ouvir as alterações de URL, veja abaixo:
Use esse estilo se você pretende parar / remover o ouvinte após uma determinada condição.
fonte
Ao fazer uma pequena extensão do Chrome, enfrentei o mesmo problema com um problema adicional: às vezes, a página muda, mas não o URL.
Por exemplo, basta ir à página inicial do Facebook e clicar no botão 'Página inicial'. Você recarregará a página, mas o URL não será alterado (estilo de aplicativo de uma página).
Em 99% do tempo, estamos desenvolvendo sites para que possamos obter esses eventos de estruturas como Angular, React, Vue etc.
MAS , no meu caso de uma extensão do Chrome (no Vanilla JS), tive que ouvir um evento que será acionado para cada "alteração de página", que geralmente pode ser detectada pela alteração de URL, mas às vezes não.
Minha solução caseira foi a seguinte:
Então, basicamente, a solução leoneckert, aplicada ao histórico da janela, que muda quando uma página é alterada em um aplicativo de página única.
Não é ciência de foguetes, mas a solução mais limpa que encontrei, considerando que estamos apenas verificando uma igualdade de números aqui, e não objetos maiores ou todo o DOM.
fonte
window.history
tem um comprimento máximo de 50 (pelo menos a partir do Chrome 80). Depois desse ponto,window.history.length
sempre retorna 50. Quando isso acontecer, esse método falhará ao reconhecer quaisquer alterações.Veja a função de descarregamento do jQuery. Ele lida com todas as coisas.
https://api.jquery.com/unload/
fonte
fonte
A resposta abaixo vem daqui (com sintaxe javascript antiga (nenhuma função de seta, suporte ao IE 10+)): https://stackoverflow.com/a/52809105/9168962
fonte
Outra maneira simples de fazer isso é adicionar um evento de clique, por meio de um nome de classe, às tags de âncora na página para detectar quando ele foi clicado. Agora você pode usar o window.location.href para obter os dados da URL que você pode usar para executar sua solicitação ajax no servidor. Simples e Fácil.
fonte
Você está iniciando um novo
setInterval
em cada chamada, sem cancelar a anterior - provavelmente só queria ter umsetTimeout
fonte