Comment puis-je vérifier si une URL a changé en JavaScript? Par exemple, des sites Web comme GitHub, qui utilisent AJAX, ajouteront des informations de page après un symbole # pour créer une URL unique sans recharger la page. Quelle est la meilleure façon de détecter si cette URL change?
- L'
onload
événement est-il rappelé? - Existe-t-il un gestionnaire d'événements pour l'URL?
- Ou l'URL doit-elle être vérifiée toutes les secondes pour détecter un changement?
javascript
ajax
AJ00200
la source
la source
Réponses:
Dans les navigateurs modernes (IE8 +, FF3.6 +, Chrome), vous pouvez simplement écouter l'
hashchange
événement surwindow
.Dans certains anciens navigateurs, vous avez besoin d'une minuterie qui vérifie en permanence
location.hash
. Si vous utilisez jQuery, il existe un plugin qui fait exactement cela.la source
beforeunload
événement. Si votre code a initié le changement d'URL, il le sait mieux.Je voulais pouvoir ajouter des
locationchange
écouteurs d'événements. Après la modification ci-dessous, nous pourrons le faire, comme ceciEn revanche,
window.addEventListener('hashchange',()=>{})
ne se déclencherait que si la partie après un hashtag dans une URL change, etwindow.addEventListener('popstate',()=>{})
ne fonctionne pas toujours.Cette modification, similaire à la réponse de Christian , modifie l'objet historique pour ajouter des fonctionnalités.
Par défaut, il y a un
popstate
événement, mais il n'y a aucun événement pourpushstate
, etreplacestate
.Cela modifie ces trois fonctions afin que toutes déclenchent un
locationchange
événement personnalisé que vous pouvez utiliser, ainsipushstate
que desreplacestate
événements si vous souhaitez les utiliser:la source
utiliser ce code
avec jQuery
la source
EDIT après un peu de recherche:
Il semble en quelque sorte que j'ai été trompé par la documentation présente sur Mozilla docs. L'
popstate
événement (et sa fonction de rappelonpopstate
) ne sont pas déclenchés chaque fois que lepushState()
oureplaceState()
est appelé dans le code. Par conséquent, la réponse originale ne s'applique pas dans tous les cas.Cependant, il existe un moyen de contourner cela en appliquant des correctifs uniques aux fonctions selon @ alpha123 :
Réponse originale
Étant donné que le titre de cette question est " Comment détecter le changement d'URL ", la réponse, lorsque vous voulez savoir quand le chemin complet change (et pas seulement l'ancre de hachage), est que vous pouvez écouter l'
popstate
événement:Référence pour popstate dans Mozilla Docs
Actuellement (janvier 2017), 92% des navigateurs dans le monde prennent en charge popstate .
la source
Avec jquery (et un plug-in), vous pouvez faire
http://benalman.com/projects/jquery-hashchange-plugin/
Sinon, oui, vous devrez utiliser setInterval et rechercher un changement dans l'événement de hachage (window.location.hash)
Mettre à jour! Un simple brouillon
la source
window.addEventListener("hashchange", hashChanged);
detect()
fonctions?Ajoutez un écouteur d'événement de changement de hachage!
Ou, pour écouter toutes les modifications d'URL:
C'est mieux que quelque chose comme le code ci-dessous car une seule chose peut exister dans window.onhashchange et vous risquez d'écraser le code de quelqu'un d'autre.
la source
cette solution a fonctionné pour moi:
la source
setInterval
ensetTimeout
: "l'utilisation de setInterval () arrêtera le navigateur après un certain temps, car cela créera un nouvel appel à checkURLchange () toutes les secondes. setTimeout () est la bonne solution, car elle n'est appelée qu'une seule fois. "setTimeout
comme @divibisan le suggère, déplacez l'setInterval
extérieur de la fonction.checkURLchange();
devient également facultatif.Bien que vieille question, le projet de barre de localisation est très utile.
la source
Pour écouter les modifications d'URL, voir ci-dessous:
Utilisez ce style si vous avez l'intention d'arrêter / de supprimer l'auditeur après une certaine condition.
la source
En faisant une petite extension chrome, j'ai rencontré le même problème avec un problème supplémentaire: Parfois, la page change mais pas l'URL.
Par exemple, allez simplement sur la page d'accueil Facebook et cliquez sur le bouton «Accueil». Vous rechargerez la page mais l'URL ne changera pas (style d'application d'une page).
99% du temps, nous développons des sites Web afin que nous puissions obtenir ces événements à partir de Frameworks tels que Angular, React, Vue, etc.
MAIS , dans mon cas d'une extension Chrome (dans Vanilla JS), j'ai dû écouter un événement qui se déclenchera à chaque "changement de page", qui peut généralement être capturé par une URL modifiée, mais parfois ce n'est pas le cas.
Ma solution maison était la suivante:
Donc, fondamentalement, la solution leoneckert, appliquée à l'historique des fenêtres, qui changera lorsqu'une page change dans une seule application de page.
Ce n'est pas sorcier, mais la solution la plus propre que j'ai trouvée, étant donné que nous ne vérifions qu'une égalité entière ici, et non des objets plus gros ou l'ensemble du DOM.
la source
window.history
a une longueur maximale de 50 (au moins à partir de Chrome 80). Après ce point,window.history.length
renvoie toujours 50. Lorsque cela se produit, cette méthode ne reconnaîtra aucune modification.Regardez la fonction de déchargement jQuery. Il gère toutes les choses.
https://api.jquery.com/unload/
la source
la source
La réponse ci-dessous vient d'ici (avec l'ancienne syntaxe javascript (pas de fonction de flèche, prend en charge IE 10+)): https://stackoverflow.com/a/52809105/9168962
la source
Une autre façon simple de le faire est d'ajouter un événement de clic, via un nom de classe aux balises d'ancrage sur la page pour détecter le moment où il a été cliqué, vous pouvez maintenant utiliser le window.location.href pour obtenir les données d'url qui vous pouvez utiliser pour exécuter votre requête ajax sur le serveur. Simple et facile.
la source
Vous commencez un nouveau
setInterval
à chaque appel, sans annuler le précédent - vous vouliez probablement seulement avoir unsetTimeout
la source