Wie kann ich überprüfen, ob sich eine URL in JavaScript geändert hat? Beispielsweise hängen Websites wie GitHub, die AJAX verwenden, Seiteninformationen nach einem # -Symbol an, um eine eindeutige URL zu erstellen, ohne die Seite neu zu laden. Was ist der beste Weg, um festzustellen, ob sich diese URL ändert?
- Wird die
onload
Veranstaltung erneut aufgerufen? - Gibt es einen Ereignishandler für die URL?
- Oder muss die URL jede Sekunde überprüft werden, um eine Änderung festzustellen?
javascript
ajax
AJ00200
quelle
quelle
Antworten:
In modernen Browsern (IE8 +, FF3.6 +, Chrome) können Sie das
hashchange
Ereignis einfach anhörenwindow
.In einigen alten Browsern benötigen Sie einen Timer, der ständig überprüft
location.hash
. Wenn Sie jQuery verwenden, gibt es ein Plugin , das genau das tut.quelle
beforeunload
Ereignis angezeigt . Wenn Ihr Code die URL-Änderung initiiert hat, weiß er es am besten.Ich wollte
locationchange
Ereignis-Listener hinzufügen können . Nach der folgenden Änderung können wir dies folgendermaßen tunIm Gegensatz dazu
window.addEventListener('hashchange',()=>{})
würde nur ausgelöst, wenn sich der Teil nach einem Hashtag in einer URL ändert undwindow.addEventListener('popstate',()=>{})
nicht immer funktioniert.Diese Änderung ändert , ähnlich wie Christians Antwort , das Verlaufsobjekt, um einige Funktionen hinzuzufügen.
Standardmäßig gibt es ein
popstate
Ereignis, aber keine Ereignisse fürpushstate
undreplacestate
.Dadurch werden diese drei Funktionen so geändert, dass alle ein benutzerdefiniertes
locationchange
Ereignis auslösen, das Sie verwenden können,pushstate
sowiereplacestate
Ereignisse, wenn Sie diese verwenden möchten:quelle
Verwenden Sie diesen Code
mit jQuery
quelle
BEARBEITEN nach ein wenig Recherche:
Es scheint irgendwie, dass ich mich von der Dokumentation in Mozilla-Dokumenten täuschen lassen habe. Das
popstate
Ereignis (und seine Rückruffunktiononpopstate
) werden nicht ausgelöst, wenn daspushState()
oderreplaceState()
im Code aufgerufen wird. Daher gilt die ursprüngliche Antwort nicht in allen Fällen.Es gibt jedoch eine Möglichkeit, dies zu umgehen, indem die Funktionen gemäß @ alpha123 durch Affen gepatcht werden :
Ursprüngliche Antwort
Da der Titel dieser Frage " So erkennen Sie URL-Änderungen " lautet, lautet die Antwort, wenn Sie wissen möchten, wann sich der vollständige Pfad ändert (und nicht nur der Hash-Anker), dass Sie auf das
popstate
Ereignis warten können :Referenz für Popstate in Mozilla Docs
Derzeit (Januar 2017) wird Popstate von 92% der Browser weltweit unterstützt.
quelle
Mit jquery (und einem Plug-In) können Sie dies tun
http://benalman.com/projects/jquery-hashchange-plugin/
Andernfalls müssten Sie setInterval verwenden und nach einer Änderung des Hash-Ereignisses suchen (window.location.hash).
Aktualisieren! Ein einfacher Entwurf
quelle
window.addEventListener("hashchange", hashChanged);
detect()
Funktionen auszuführen ?Fügen Sie einen Listener für Hash-Änderungsereignisse hinzu!
Oder um alle URL-Änderungen abzuhören:
Dies ist besser als der folgende Code, da in window.onhashchange nur eines vorhanden sein kann und Sie möglicherweise den Code eines anderen überschreiben.
quelle
Diese Lösung hat bei mir funktioniert:
quelle
setInterval
ansetTimeout
. „mit setInterval () wird den Browser zum Stillstand nach einer Weile bringen, weil es einen neuen Anruf zu checkURLchange schaffen () jedem zweiten setTimeout () ist die richtige Lösung, weil sie nur einmal aufgerufen wird. "setTimeout
wie von @divibisan vorgeschlagen zu verwenden, verschieben Sie diesetInterval
Außenseite der Funktion.checkURLchange();
wird auch optional.Obwohl dies eine alte Frage ist, ist das Location-Bar- Projekt sehr nützlich.
quelle
Informationen zum Anhören von URL-Änderungen finden Sie unten:
Verwenden Sie diesen Stil, wenn Sie den Listener nach einer bestimmten Bedingung stoppen / entfernen möchten.
quelle
Bei einer kleinen Chrome-Erweiterung hatte ich das gleiche Problem mit einem zusätzlichen Problem: Manchmal ändert sich die Seite, aber nicht die URL.
Gehen Sie zum Beispiel einfach zur Facebook-Homepage und klicken Sie auf die Schaltfläche "Home". Sie werden die Seite neu laden, aber die URL ändert sich nicht (einseitiger App-Stil).
In 99% der Fälle entwickeln wir Websites, damit wir diese Ereignisse von Frameworks wie Angular, React, Vue usw. abrufen können.
ABER in meinem Fall einer Chrome-Erweiterung (in Vanilla JS) musste ich mir ein Ereignis anhören, das bei jedem "Seitenwechsel" ausgelöst wird, der im Allgemeinen durch eine geänderte URL abgefangen werden kann, aber manchmal nicht.
Meine hausgemachte Lösung war die folgende:
Im Grunde genommen also die Leoneckert-Lösung, die auf den Fensterverlauf angewendet wird und sich ändert, wenn sich eine Seite in einer einzelnen Seiten-App ändert.
Keine Raketenwissenschaft, aber die sauberste Lösung, die ich gefunden habe, wenn man bedenkt, dass wir hier nur eine ganzzahlige Gleichheit prüfen und nicht größere Objekte oder das gesamte DOM.
quelle
window.history
hat eine maximale Länge von 50 (mindestens ab Chrome 80). Nach diesem Punkt wirdwindow.history.length
immer 50 zurückgegeben. In diesem Fall erkennt diese Methode keine Änderungen.Schauen Sie sich die jQuery-Entladefunktion an. Es kümmert sich um alle Dinge.
https://api.jquery.com/unload/
quelle
quelle
Die folgende Antwort stammt von hier (mit alter Javascript-Syntax (keine Pfeilfunktion, unterstützt IE 10+)): https://stackoverflow.com/a/52809105/9168962
quelle
Eine andere einfache Möglichkeit, dies zu tun, besteht darin, ein Klickereignis über einen Klassennamen zu den Ankertags auf der Seite hinzuzufügen, um zu erkennen, wann darauf geklickt wurde. Anschließend können Sie die Datei window.location.href verwenden, um die URL-Daten abzurufen, die Sie können damit Ihre Ajax-Anfrage an den Server ausführen. Simpel und einfach.
quelle
Sie starten
setInterval
bei jedem Anruf einen neuen , ohne den vorherigen abzubrechen - wahrscheinlich wollten Sie nur einen habensetTimeout
quelle