PL
JavaScript - zdarzenie zmiany lokalizacji / zdarzenie zmiany adresu URL
0 points
W tym krótkim artykule chcielibyśmy pokazać, jak za pomocą JavaScript wykryć, czy adres URL strony (obiekt location
) został zmieniony.
W JavaScript nie ma zdarzenia
locationchange
, ale jest kilka sztuczek, jak to zrobić.
Szybkie rozwiązanie:
xxxxxxxxxx
1
// Umieść poniższy kod na samej górze elementu head:
2
3
;(function() {
4
var pushState = history.pushState;
5
var replaceState = history.replaceState;
6
7
history.pushState = function() {
8
pushState.apply(history, arguments);
9
window.dispatchEvent(new Event('pushstate'));
10
window.dispatchEvent(new Event('locationchange'));
11
};
12
13
history.replaceState = function() {
14
replaceState.apply(history, arguments);
15
window.dispatchEvent(new Event('replacestate'));
16
window.dispatchEvent(new Event('locationchange'));
17
};
18
19
window.addEventListener('popstate', function() {
20
window.dispatchEvent(new Event('locationchange'))
21
});
22
})();
23
24
// Przykład użycia
25
26
window.addEventListener('locationchange', function(){
27
console.log('onlocationchange event occurred!');
28
})
Ze zmianą monitorowania location
związane są trzy przypadki:
- zmiana adresu URL z interfejsu przeglądarki przez użytkownika powoduje przeładowanie całej strony i wykonanie dwóch operacji: rozładuj i załaduj stronę - to tylko otwarcie nowej strony,
location
zmieniony przez History API (pushState
,replaceState
,popState
) nie powoduje przeładowania strony. API nie zapewnia również żadnego zdarzenialocationchange
. Konieczne jest wywołanie logiki po metodach, np
-
xxxxxxxxxx
1history.pushState( );
2callEventLogic();
3
4// ...
5
6history.popState( );
7callEventLogic();
8
9// etc.
- hash zmieniony w url (
location.hash
) jest dostarczany przez oddzielne zdarzenie:xxxxxxxxxx
1window.addEventListener('hashchange', function(){
2console.log('onhashchange event occurred!');
3})
Podsumowanie: konieczne jest dodanie własnej obsługi zdarzeń
locationchange
, o czym mowa w drugim punkcie powyższej listy i co zostało przedstawione również w Szybkim rozwiązaniu.