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 onloadponowne 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.writew skrypcie wbudowanym całkowicie zniszczyłoby stronę).
Powodem, dla którego pisanie do window.onunloadma 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 onunloadwystą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 onpageshowi onpagehide:
window.onload=window.onpageshow= function() {
alert('Hello!');
};