We wszystkich głównych przeglądarkach (oprócz IE) onload
zdarzenie JavaScript nie jest uruchamiane, gdy strona ładuje się w wyniku operacji przycisku Wstecz - uruchamia się tylko przy pierwszym załadowaniu strony.
Czy ktoś może wskazać mi przykładowy kod przeglądarki (Firefox, Opera, Safari, IE,…), który rozwiązuje ten problem? Znam pageshow
wydarzenie Firefoksa, ale niestety ani Opera, ani Safari nie implementują tego.
javascript
pageload
Rachunek
źródło
źródło
Odpowiedzi:
Ludzie, odkryłem, że JQuery ma tylko jeden efekt: strona jest ładowana ponownie po naciśnięciu przycisku Wstecz. Nie ma to nic wspólnego z „ gotowym ”.
Jak to działa? Cóż, JQuery dodaje detektor zdarzeń onunload .
Domyślnie nic nie robi. Ale jakoś to wydaje się wyzwalać przeładowanie w Safari, Operze i Mozilli - bez względu na to, co zawiera moduł obsługi zdarzeń.
[ edit (Nickolay) : oto dlaczego tak działa: webkit.org , developer.mozilla.org . Przeczytaj te artykuły (lub moje streszczenie w osobnej odpowiedzi poniżej) i zastanów się, czy naprawdę musisz to zrobić i spowolnić ładowanie strony dla użytkowników.]
Nie możesz w to uwierzyć? Spróbuj tego:
Podobne wyniki zobaczysz podczas korzystania z JQuery.
Możesz porównać do tego bez obciążenia
źródło
onunload
obsługi (strona już wszystko zniszczyła; po co ją buforować?).Niektóre nowoczesne przeglądarki (Firefox, Safari i Opera, ale nie Chrome) obsługują specjalną pamięć podręczną „wstecz / do przodu” (nazywam ją bfcache, która jest terminem wymyślonym przez Mozillę), zaangażowaną, gdy użytkownik nawiguje wstecz. W przeciwieństwie do zwykłej pamięci podręcznej (HTTP), przechwytuje pełny stan strony (w tym stan JS, DOM). Pozwala to na szybsze ładowanie strony dokładnie tak, jak użytkownik ją opuścił.
load
Wydarzenie nie ma ognia, gdy strona jest ładowany z tego bfcache. Na przykład, jeśli utworzyłeś swój interfejs w module obsługi „load”, a zdarzenie „load” zostało uruchomione raz przy pierwszym ładowaniu, a po raz drugi, gdy strona została ponownie załadowana z bfcache, strona skończyłaby się zduplikowane elementy interfejsu użytkownika.Z tego powodu dodanie modułu obsługi „unload” powoduje, że strona nie jest przechowywana w bfcache (co spowalnia powrót do poprzedniej strony) - moduł obsługi unload może wykonywać zadania czyszczenia, które mogą pozostawić stronę w stanie niemożliwym do wykonania.
W przypadku stron, które muszą wiedzieć, kiedy są nawigowane do / z powrotem, Firefox 1.5+ i wersja Safari z poprawką błędu 28758 obsługują specjalne zdarzenia o nazwie „pagehow” i „pagehide”.
Bibliografia:
źródło
Wystąpił problem, który nie był wykonywany przez mój plik js, gdy użytkownik kliknął przycisk Wstecz lub Dalej. Najpierw postanowiłem zatrzymać buforowanie przeglądarki, ale nie wyglądało to na problem. Mój skrypt javascript został skonfigurowany do działania po załadowaniu wszystkich bibliotek itp. Sprawdziłem je za pomocą zdarzenia readyStateChange.
Po kilku testach dowiedziałem się, że element readyState elementu na stronie, na której kliknięto Wstecz, nie jest „ładowany”, ale „zakończony”. Dodanie
|| element.readyState == 'complete'
do mojego warunkowego stwierdzenia rozwiązało moje problemy.Pomyślałem, że podzielę się swoimi odkryciami, mam nadzieję, że pomogą komuś innemu.
Edytuj dla kompletności
Mój kod wyglądał następująco:
W powyższym przykładzie kodu zmienną skryptu był nowo utworzony element skryptu, który został dodany do modelu DOM.
źródło
OK, oto ostateczne rozwiązanie oparte na wstępnym rozwiązaniu ckramera i przykładzie palehorse, które działa we wszystkich przeglądarkach, w tym w Operze. Jeśli ustawisz history.navigationMode na „zgodny”, funkcja gotowości jQuery uruchomi się na operacjach przycisku Wstecz w Operze, a także w innych głównych przeglądarkach.
Ta strona zawiera więcej informacji .
Przykład:
Przetestowałem to w Operze 9.5, IE7, FF3 i Safari i działa we wszystkich.
źródło
Nie udało mi się uruchomić powyższych przykładów. Po prostu chciałem uruchomić odświeżanie niektórych zmodyfikowanych obszarów div, gdy wracam na stronę za pomocą przycisku Wstecz. Sztuczka, której użyłem, polegała na ustawieniu ukrytego pola wejściowego (zwanego „brudnym bitem”) na 1, gdy tylko obszary div zmieniły się z oryginału. Ukryte pole wejściowe faktycznie zachowuje swoją wartość po kliknięciu, więc onload mogę sprawdzić ten bit. Jeśli jest ustawiony, odświeżam stronę (lub po prostu odświeżam div). Jednak przy oryginalnym ładowaniu bit nie jest ustawiony, więc nie tracę czasu na ładowanie strony dwukrotnie.
I zadziałałby poprawnie, gdy kliknę przycisk Wstecz.
źródło
Jeśli dobrze pamiętam, dodanie zdarzenia unload () oznacza, że strony nie można buforować (w pamięci podręcznej do przodu / do tyłu) - ponieważ jej stan zmienia się / może ulec zmianie, gdy użytkownik opuści stronę. Tak więc - nie jest bezpiecznie przywracać stanu ostatniej sekundy strony podczas powrotu do niej poprzez nawigację po obiekcie historii.
źródło
Myślałem, że będzie to dotyczyło „onunload”, a nie ładowania strony, ponieważ czy nie mówimy o uruchomieniu zdarzenia po naciśnięciu „Back”? $ document.ready () dotyczy zdarzeń pożądanych przy ładowaniu strony, bez względu na to, jak dojdziesz do tej strony (tj. przekierowanie, otwarcie przeglądarki bezpośrednio na adres URL itp.), a nie kliknięcie „Wstecz”, chyba że mówisz o tym, co wystrzelić na poprzedniej stronie, gdy zostanie ponownie załadowana. I nie jestem pewien, czy strona nie jest buforowana, ponieważ zauważyłem, że JavaScript nadal jest dostępny, nawet jeśli zawiera on $ document.ready (). Musieliśmy nacisnąć Ctrl + F5 podczas edycji naszych skryptów, które mają to wydarzenie, za każdym razem, gdy je poprawimy i chcemy przetestować wyniki na naszych stronach.
jest to, czego chcesz dla zdarzenia onunload po naciśnięciu „Wstecz” i rozładowaniu bieżącej strony, a także uruchamiałby się, gdy użytkownik zamknie okno przeglądarki. To brzmiało bardziej jak to, co było pożądane, nawet jeśli mam przewagę liczebną odpowiedzi $ document.ready (). Zasadniczo różnica polega na tym, że zdarzenie jest uruchamiane na bieżącej stronie podczas jej zamykania lub na tym, które ładuje się po kliknięciu „Wstecz” podczas ładowania. Testowane w IE 7 w porządku, nie mogą mówić w przypadku innych przeglądarek, ponieważ nie są dozwolone tam, gdzie jesteśmy. Ale może to być inna opcja.
źródło
Mogę potwierdzić ckramer, że gotowe zdarzenie jQuery działa w IE i FireFox. Oto próbka:
źródło
dla osób, które nie chcą korzystać z całej biblioteki jquery, wyodrębniłem implementację w osobnym kodzie. Ma tylko 0,4 KB.
Kod wraz z niemieckim samouczkiem można znaleźć na tej wiki: http://www.easy-coding.de/wiki/html-ajax-und-co/onload-event-cross-browser-kompatibler-domcontentloaded.html
źródło
Gotowe wydarzenie jQuery zostało stworzone tylko dla tego rodzaju problemu. Możesz zagłębić się w implementację, aby zobaczyć, co się dzieje pod przykryciem.
źródło
ready
wydaje się , że nie jest uruchamiany w Firefoksie, gdy używasz przycisku Wstecz. Zobacz także odpowiedź Nickolay .Bill, odważę się odpowiedzieć na twoje pytanie, jednak nie jestem w 100% pewien swoich przypuszczeń. Myślę, że przeglądarki inne niż IE, gdy zabiorą użytkownika na stronę w historii, nie tylko załadują stronę i jej zasoby z pamięci podręcznej, ale także przywrócą dla niej cały stan DOM (sesja odczytu). IE nie wykonuje przywracania DOM (lub nie dzierżawi tego), dlatego zdarzenie onload wydaje się konieczne do prawidłowej ponownej inicjalizacji strony.
źródło
Wypróbowałem rozwiązanie od Billa za pomocą $ (dokumentu) .ready ... ale na początku nie zadziałało. Odkryłem, że jeśli skrypt zostanie umieszczony za sekcją HTML, to nie będzie działać. Jeśli jest to sekcja główna, będzie działać, ale tylko w IE. Skrypt nie działa w przeglądarce Firefox.
źródło
OK, próbowałem tego i działa w Firefox 3, Safari 3.1.1 i IE7, ale nie w Operze 9.52.
Jeśli użyjesz przykładu pokazanego poniżej (na podstawie przykładu palehorse), pojawi się okienko z ostrzeżeniem, gdy strona zostanie załadowana po raz pierwszy. Ale jeśli przejdziesz do innego adresu URL, a następnie wciśniesz przycisk Wstecz, aby wrócić do tej strony, w Operze nie pojawi się wyskakujące okienko z ostrzeżeniem (ale w innych przeglądarkach).
W każdym razie myślę, że na razie jest wystarczająco blisko. Dziękuję wszystkim!
źródło
Zdarzenie wyładowania nie działa poprawnie w IE 9. Wypróbowałem to ze zdarzeniem load (onload ()), działa dobrze w IE 9 i FF5 .
Przykład:
źródło
Użyłem szablonu HTML. W pliku custom.js tego szablonu była taka funkcja:
Ale ta funkcja nie działała, gdy wracam do poprzedniej strony.
Próbowałem tego i zadziałało:
Teraz mam 2 funkcje „gotowe”, ale nie daje to żadnego błędu, a strona działa bardzo dobrze.
Niemniej jednak muszę zadeklarować, że przetestował na Windows 10 - Opera v53 i Edge v42, ale nie ma innych przeglądarek. Pamiętaj o tym ...
Uwaga: wersja jquery to 3.3.1, a wersja migracji to 3.0.0
źródło