Jak mogę sprawdzić, czy adres URL zmienił się w JavaScript? Na przykład strony internetowe takie jak GitHub, które używają AJAX, dołączą informacje o stronie po symbolu #, aby utworzyć unikalny adres URL bez ponownego ładowania strony. Jaki jest najlepszy sposób na wykrycie, czy ten adres URL się zmienia?
- Czy
onload
wydarzenie zostało ponownie wywołane? - Czy istnieje program obsługi zdarzeń dla adresu URL?
- A może adres URL musi być sprawdzany co sekundę, aby wykryć zmianę?
javascript
ajax
AJ00200
źródło
źródło
Odpowiedzi:
W nowoczesnych przeglądarkach (IE8 +, FF3.6 +, Chrome) można po prostu posłuchać
hashchange
wydarzenia nawindow
.W niektórych starych przeglądarkach potrzebny jest licznik czasu, który nieustannie sprawdza
location.hash
. Jeśli używasz jQuery, istnieje wtyczka , która dokładnie to robi.źródło
beforeunload
zdarzenie. Jeśli Twój kod zainicjował zmianę adresu URL, wie najlepiej.Chciałem mieć możliwość dodawania
locationchange
słuchaczy zdarzeń. Po poniższej modyfikacji będziemy mogli to zrobić w ten sposóbW przeciwieństwie do tego,
window.addEventListener('hashchange',()=>{})
będzie uruchamiane tylko wtedy, gdy zmieni się część po hashtagu w adresie URL iwindow.addEventListener('popstate',()=>{})
nie zawsze działa.Ta modyfikacja, podobnie jak odpowiedź Christiana , modyfikuje obiekt historii, aby dodać pewną funkcjonalność.
Domyślnie istnieje
popstate
wydarzenie, ale nie ma wydarzeń dlapushstate
ireplacestate
.Modyfikuje te trzy funkcje, dzięki czemu cały ogień zwyczaj
locationchange
wydarzenie do użycia, a takżepushstate
ireplacestate
wydarzenia, jeśli chcesz korzystać z tych:źródło
użyj tego kodu
z jQuery
źródło
EDYTUJ po krótkiej analizie:
Wygląda na to, że dałem się nabrać na dokumentację obecną w dokumentach Mozilli.
popstate
Wydarzenie (i jego funkcja zwrotnaonpopstate
) są nie wywołał , gdypushState()
alboreplaceState()
są wywoływane w kodzie. Dlatego oryginalna odpowiedź nie ma zastosowania we wszystkich przypadkach.Istnieje jednak sposób na obejście tego przez małpowanie funkcji zgodnie z @ alpha123 :
Oryginalna odpowiedź
Biorąc pod uwagę, że tytuł tego pytania brzmi „ Jak wykryć zmianę adresu URL ”, jeśli chcesz wiedzieć, kiedy zmienia się pełna ścieżka (a nie tylko zakotwiczenie skrótu), możesz nasłuchiwać
popstate
zdarzenia:Odniesienie do popstate w Mozilla Docs
Obecnie (styczeń 2017) popstate obsługuje 92% przeglądarek na całym świecie.
źródło
Dzięki jquery (i wtyczce) możesz to zrobić
http://benalman.com/projects/jquery-hashchange-plugin/
W przeciwnym razie tak, musiałbyś użyć setInterval i sprawdzić, czy wystąpiła zmiana w zdarzeniu hash (window.location.hash)
Aktualizacja! Prosty szkic
źródło
window.addEventListener("hashchange", hashChanged);
detect()
funkcji?Dodaj odbiornik zdarzeń zmiany skrótu!
Lub, aby odsłuchać wszystkie zmiany adresu URL:
Jest to lepsze niż coś takiego jak poniższy kod, ponieważ tylko jedna rzecz może istnieć w window.onhashchange i prawdopodobnie nadpisujesz kod kogoś innego.
źródło
to rozwiązanie zadziałało dla mnie:
źródło
setInterval
nasetTimeout
: "użycie setInterval () spowoduje zatrzymanie przeglądarki po chwili, ponieważ co sekundę będzie tworzyć nowe wywołanie funkcji checkURLchange (). setTimeout () jest właściwym rozwiązaniem, ponieważ jest wywoływane tylko raz. "setTimeout
co sugeruje @divibisan, przesuńsetInterval
zewnętrzną stronę funkcji.checkURLchange();
również staje się opcjonalne.Chociaż to stare pytanie, projekt paska lokalizacji jest bardzo przydatny.
źródło
Aby odsłuchać zmiany adresu URL, zobacz poniżej:
Użyj tego stylu, jeśli zamierzasz zatrzymać / usunąć słuchacza po spełnieniu pewnych warunków.
źródło
Robiąc małe rozszerzenie do Chrome, napotkałem ten sam problem z dodatkowym problemem: czasami strona się zmienia, ale nie adres URL.
Na przykład po prostu przejdź do strony głównej Facebooka i kliknij przycisk „Strona główna”. Ponownie załadujesz stronę, ale adres URL nie ulegnie zmianie (styl aplikacji jednostronicowej).
W 99% tworzymy strony internetowe, abyśmy mogli pobierać te zdarzenia z ram, takich jak Angular, React, Vue itp.
ALE , w moim przypadku rozszerzenia Chrome (w Vanilla JS), musiałem słuchać zdarzenia, które będzie wyzwalane przy każdej „zmianie strony”, które generalnie można wychwycić po zmianie adresu URL, ale czasami tak się nie dzieje.
Moje domowe rozwiązanie było następujące:
A więc w zasadzie rozwiązanie leoneckert, zastosowane do historii okien, które zmieni się, gdy strona zmieni się w aplikacji pojedynczej strony.
To nie fizyka jądrowa, ale najczystsze rozwiązanie, jakie znalazłem, biorąc pod uwagę, że sprawdzamy tutaj tylko całkowitą równość, a nie większe obiekty lub cały DOM.
źródło
window.history
ma maksymalną długość 50 (przynajmniej od Chrome 80). Po tym momenciewindow.history.length
zawsze zwraca 50. W takim przypadku ta metoda nie rozpozna żadnych zmian.Spójrz na funkcję wyładowania jQuery. Obsługuje wszystkie rzeczy.
https://api.jquery.com/unload/
źródło
źródło
Odpowiedź poniżej pochodzi stąd (ze starą składnią javascript (bez funkcji strzałek, obsługa IE 10+)): https://stackoverflow.com/a/52809105/9168962
źródło
Innym prostym sposobem na to jest dodanie zdarzenia kliknięcia, poprzez nazwę klasy do znaczników kotwicy na stronie, aby wykryć, kiedy została kliknięta, a następnie możesz teraz użyć window.location.href do pobrania danych adresu URL, które możesz użyć do uruchomienia żądania AJAX do serwera. Proste i łatwe.
źródło
Zaczynasz nowe
setInterval
przy każdym połączeniu, bez anulowania poprzedniego - prawdopodobnie chciałeś mieć tylkosetTimeout
źródło