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 .
Czy jest jakieś rozwiązanie / obejście umożliwiające ponowne wykonanie skryptów podczas przeglądania strony po raz drugi?
Pamiętaj, że testowałem te same strony w Google Chrome i Internet Explorer i działają zgodnie z przeznaczeniem.
Oto pliki i kroki, które wykonałem, aby przetestować problem:
(przejdź do 0.html, kliknij, aby przejść do 1.html, przycisk Wstecz)
0.html
<html><body>
<script>
window.onload = function() { alert('window.onload alert'); };
alert('inline alert');
</script>
<a href="1.html">Click Me!</a>
</body></html>
1.html
<html><body>
<p>Go BACK!</p>
</body></html>
javascript
firefox
Patonza
źródło
źródło
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ą, kiedyonunload
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
ionpagehide
:window.onload=window.onpageshow= function() { alert('Hello!'); };
źródło
document.ready
będzie działać zasadniczo w taki sam sposób, jakwindow.onload
(dla niektórych przeglądarek i tak są to to samo zdarzenie).Możesz sprawdzić
persisted
właściwościpageshow
wydarzenia. Przy pierwszym wczytywaniu strony ma wartość false. Kiedy strona jest ładowana z pamięci podręcznej, ustawiana jest na true.window.onpageshow = function(event) { if (event.persisted) { alert("From bfcache"); } };
Z jakiegoś powodu jQuery nie ma tej właściwości w zdarzeniu. Można go jednak znaleźć z oryginalnego wydarzenia.
$(window).bind("pageshow", function(event) { if (event.originalEvent.persisted) { alert("From bfcache"); } });
źródło
Połącz w zdarzeniu „onunload”, które nic nie robi:
<html><body> <script type="text/javascript"> window.onload = function() { alert('window.onload alert'); }; window.onunload = function(){}; alert('inline alert'); </script> <a href="1.html">Click Me!</a> </body></html>
źródło
onpopstate
pytanie, kiedy to pytanie zadano prawie pięć lat temu, to wydarzenie było wciąż stosunkowo nowe, a obsługa przeglądarek była bardzo niespójnaO ile wiem, Firefox nie uruchamia
onLoad
zdarzenia z tyłu.Powinien wyzwalać onFocus zamiast na podstawie tego linku tutaj .
źródło
Prostym sposobem spowodowania, aby strona wykonywała JavaScript, gdy użytkownik przechodzi z powrotem do niej przy użyciu historii przeglądarki, jest zdarzenie OnPopState. Używamy tego do wstrzymywania i ponownego odtwarzania wideo na naszej stronie głównej ( https://fynydd.com ).
window.onpopstate = function() { // Do stuff here... };
źródło
w niektórych przypadkach, takich jak operacje AJAX, można użyć nasłuchiwania zmian adresu URL
$(window).on('hashchange', function() { .... });
źródło