2011-11-21 15 views
5

Zacząłem test History.js. Po zrozumieniu, jak to działa i nie ma numeru popstate, zamiast niego jest statechange. Po kliknięciu przycisku Wstecz przeglądarki szukam innego sposobu.Czy istnieje sposób w History.js wiedzieć, kiedy przycisk Wstecz został naciśnięty

Powodem jest to, że muszę znać adres URL przed przeniesieniem stanu, od tego, który mam zamiar. Z projektem gist wygląda tylko adres URL, do którego się udajemy.

Mam nadzieję, że rozwiązaniem nie będzie śledzenie ostatniego odwiedzonego adresu URL w zmiennej globalnej.

Dzięki

Odpowiedz

4

wiem, że to jest dość przestarzały pytanie, ale doszedłem do rozwiązania problemów z przyciskiem tyłu/do przodu podczas przełączania między standardowym stronie i stronie Historia państw.

Scenariusz: użycie HTML5 Historia (lub history.js plugin) na zbiorze stron Wtedy inne strony musimy rzeczywistych obciążeń, aka standardowej strony (nie pytajcie dlaczego, ale istnieją pewne przypadki użycia, że ​​ta może być potrzebny)

Po przejściu ze strony Stan historii i wykonaniu rzeczywistego obciążenia na stronie standardowej. Nie możesz wejść w BACK: zmienia adres URL, ale nie ładuje strony - uruchamia tylko zmianę statyczną; które zakładam jest kwestią oryginalnego postu. Moim osobistym zdaniem jest to błąd przeglądarki (wszystkie przeglądarki mają problem), ponieważ przeglądarka powinna wiedzieć, że strona, na której się znajdujesz, została ponownie załadowana poza stronę stanu historii.

Naprawiłem to za pomocą czegoś naprawdę prostego: Odsłuchanie zdarzenia w stateczange i poinformowanie przeglądarki, aby odświeżyło się po uruchomieniu. W ten sposób nie obchodzi mnie, czy wrócą oni z tej strony. Jeśli przeglądarka myśli, że stan się zmienia (linki nie wywołują zdarzenia z ustawieniami statystyk), tylko powrót/do przodu na stronie stanu Historii uruchamia to wydarzenie, więc rozwiązuje problem.

kod, za pomocą wtyczki jQuery + History.js:

$(window).on('statechange', function() { 
    window.location.reload(); 
}); 

Jeśli to nie ma sensu, jesteś prawdopodobnie nie mają tego problemu. Zauważyłem to jednak na wielu stronach, które używają HTML 5 History (nawet pinterest.com ma ten problem, jeśli przeładowujesz, gdy na modalnym obrazie, a następnie spróbujesz wrócić).

Mamy nadzieję, że jeśli masz ten problem, znajdziesz tę odpowiedź i mają ogromną ulgą :)

+2

myślałem podobną logiką, jednak stateChange zostanie uruchomiony, gdy problem pushState i kiedy tyłu/do przodu jest wciśnięty, co stwarza nieskończoną pętlę przeładowaniem. – Dean

+0

Rzeczywiście, ogromna ulga. Już miałem się poddać. –

17

znalazłem rozwiązania na github być nieco przesadzone do moich celów. Stworzyłem bool, który zawsze jest prawdziwy, chyba że wcześniej, kiedy użyłem Historii do zmiany stanu.

var manualStateChange = true; 

History.Adapter.bind(window,'statechange',function(){ 
    if(manualStateChange == true){ 
    // BACK BUTTON WAS PRESSED 
    } 
    manualStateChange = true; 
}); 

każdym razem programowo zmienić stan ustaw bool false:

manualStateChange = false; 
History.pushState(null, null, currentPath); 
+0

dobre myślenie ... – JDandChips

+1

Zrobiłem to samo, ale to nie rozróżnia przycisków "do tyłu" i "do przodu". – GTCrais

+0

Dokładnie tego potrzebowałem, dzięki: D ... Potrzebowałem tylko 'location.reload()' w bit '' BACK BUTTON PRESSED', więc 'back' i 'forward' nie są problemem: D –

0

W „oficjalnej” wersji ta funkcja nie jest dostępna. Spróbuj użyć tego pliku w trybie głównym, gdy: https://github.com/danger89/history.js/blob/master/scripts/bundled/html5/jquery.history.js

Nie mogę zagwarantować, że jego rozwiązanie działa dla każdej przeglądarki. Ale to dobre rozwiązanie. Jeśli zastosowano jego zmiany, można użyć:

var State = History.getState(); 
if (State.navigation) { 
    // Back/forward button is pressed. 
} 

Więcej informacji można znaleźć na Github issue 47.

0

Podobna odpowiedź niż odpowiedź Jamesa Waggonera. Zdarzenie "statechange" było wystrzeliwane w obie strony, więc zamiast tego sprawdzam tylko zdarzenie "popstate", które w moim przypadku jest wywoływane tylko po powrocie użytkownika.

window.addEventListener('popstate', function() { 
    window.location.reload(); 
}); 
Powiązane problemy