Kiedy używam przycisku Wstecz w przeglądarce Firefox, aby przejść do poprzednio odwiedzanej strony, skrypty na tej stronie nie będą działać ponownie.
Zgadza się i to dobrze.
Kiedy trafisz na łącze w przeglądarce Firefox (oraz Safari i Opera), nie niszczy to natychmiast twojej strony, aby przejść do następnej. Utrzymuje stronę w stanie nienaruszonym, jedynie ukrywając ją przed widokiem. Jeśli naciśniesz przycisk Wstecz, ponownie wyświetli się stara strona bez konieczności ponownego ładowania dokumentu; jest to znacznie szybsze, co skutkuje płynniejszym przejściem strony wstecz / dalej dla użytkownika.
Ta funkcja nosi nazwę bfcache .
Wszelkie treści dodane do strony podczas poprzedniego ładowania użytkownika i korzystania z niej będą nadal dostępne. Wszystkie programy obsługi zdarzeń dołączone do elementów strony będą nadal dołączone. Wszelkie ustawione limity czasu / interwały będą nadal aktywne. Rzadko więc istnieje powód, dla którego musisz wiedzieć, że zostałeś ukryty i ponownie pokazany. Błędem byłoby onload
ponowne wywołanie lub wbudowany kod skryptu, ponieważ każde powiązanie i generowanie treści wykonane w tej funkcji byłoby wykonywane po raz drugi na tej samej zawartości, co mogłoby mieć katastrofalne skutki. (np. document.write
w skrypcie wbudowanym całkowicie zniszczyłoby stronę).
Powodem, dla którego pisanie do window.onunload
ma wpływ, jest to, że przeglądarki, które implementują bfcache, zdecydowały, że - ze względu na zgodność ze stronami, które naprawdę muszą wiedzieć, kiedy są odrzucane - każda strona, która deklaruje zainteresowanie wiedzą, kiedy onunload
wystąpi, spowoduje, że bfcache być niepełnosprawnym. Ta strona zostanie załadowana na nowo, gdy wrócisz do niej, zamiast pobierana z bfcache.
Więc jeśli ustawisz window.onunload= function() {};
, to, co faktycznie robisz, to celowe niszczenie bfcache. Spowoduje to spowolnienie nawigacji na stronach i nie powinno być używane z wyjątkiem ostateczności.
Jeśli chcesz wiedzieć, kiedy użytkownik opuszcza lub wraca na twoją stronę, bez naruszania bfcache, możesz zamiast tego przechwycić zdarzenia onpageshow
i onpagehide
:
window.onload=window.onpageshow= function() {
alert('Hello!');
};