2010-09-23 13 views
18

Dlatego chcę przechowywać pewne informacje w localstorage przeglądarki, gdy strona jest odświeżana lub użytkownik opuszcza stronę do przyszłego użytku. Pomyślałem, że użyję kodu JavaScript, aby wykryć zdarzenie i zapisać stan wizyty na stronie.JavaScript pytanie: Onbeforeunload lub Onunload?

Teraz moja sytuacja jest: czy powinienem użyć metody Onbeforeunload lub Onunload, aby osiągnąć ten cel?

Dzięki

+0

See wsparcie przeglądarka 'onbeforeunload' WindowEventHandler na https://developer.mozilla.org/en-US/docs/WindowEventHandlers.onbeforeunload#Browser_compatibility –

+0

zobacz obsługę przeglądarki 'onunload' WindowEventHandler na https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers.onunload#Browser_compatibility (Zwróć uwagę, że wersje przeglądarki nie zostały określone w tym dokumencie) –

+0

powiązane http://stackoverflow.com/questions/158673/onbeforeunload-support-detection –

Odpowiedz

20

Dlaczego nie zarejestrować go tak, aby być po bezpiecznej stronie? Wystarczy, że słuchacz zrobi czek, aby sprawdzić, czy dane są jeszcze zapisane i wyjść wcześniej.

Oto krótki przykład za pomocą właściwości zdarzeń:

window.onunload = window.onbeforeunload = (function(){ 

    var didMyThingYet=false; 

    return function(){ 
    if (didMyThingYet) return; 
    didMyThingYet=true; 
    // do your thing here... 
    } 

}()); 

Albo można użyć attachEvent:

(function(){ 

    var didMyThingYet=false; 

    function listener(){ 
    if (didMyThingYet) return; 
    didMyThingYet=true; 
    // do your thing here... 
    } 

    window.attachEvent("onbeforeunload", listener); 
    window.attachEvent("onunload", listener);  

}()); 
+1

To brzmi jak możliwy do zrealizowania pomysł na pokrycie wszystkich baz. Byłoby wspaniale, gdybyś mógł skierować mnie do fragmentu lub zasobu, o ile słuchacz wydarzeń i wychodzenie z niego dobiegnie końca. – pratyk

+0

dzięki za urywek. Wypróbowałem to w oknach i Mac OS chrome/firefox i wydawało się, że obejmuje wszystkie bazy. Trochę więcej testów dla Opery i IE9 beta powinno mnie uruchomić. – pratyk

0

wierzę, że onbeforeunload jest bezpieczny zakład. Możliwe, że przeglądarka nie uruchomi całkowicie skryptu onunload - na przykład, jeśli masz alert onunload, chrome nie wyświetli się po zamknięciu okna.

+3

Testowałem Chrome w wersjach 5 i 6 na Mac OS X i robi on alert w OnUnload. Szkoda, że ​​nie było macierzy/wykresu, który wyświetliłby wsparcie DOM dla każdej przeglądarki. Dzięki. – pratyk

8

odpowiednim miejscu, aby to zrobić jest onUnload. onbeforenload jest przeznaczony do użycia, gdy użytkownik może nie chcieć powstrzymywać użytkownika od opuszczania strony, na przykład w przypadku niezapisanych danych.

Byłbym zmęczony pisaniem kodu na wszystkie przypadki, ponieważ nie chcesz testować wszystkich przypadków. Jeśli wykonasz swoje badania i okaże się, że jest to zbyt skomplikowane w różnych przeglądarkach, tak, zrób tak dużo, jak możesz. Uważam jednak, że nie ma problemu z robieniem lokalnego miejsca na dysku. Właściwie to natknąłem się na problem, próbując wysłać informacje do serwera onunload. To nie zdarzyło się niezawodnie w różnych przeglądarkach, więc skończyłem z podejściem, które wykorzystywało zarówno rozładowanie, jak i wcześniej, ale tylko po należytej staranności.

Moja sugestia to zrób to onload, sprawdź wszystkie przeglądarki.

+0

+1 Próbowałem z obydwoma, a Chrome podnosi brzydkie okno dialogowe z 'onbeforeunload', jeśli wywołasz w nim' indexedDB.deleteDatabase', ale z przyjemnością wykonasz to samo połączenie wewnątrz 'onunload'. –

0

Z mojego doświadczenia: używaj onunload, ponieważ Opera nie obsługuje innego zdarzenia. Tak, wiem ... Opera ... ale nadal :)

+0

Aktualizacja: Opera używa teraz V8 :) –

Powiązane problemy