Wenn ich in Firefox die Schaltfläche "Zurück" verwende, um zu einer zuvor besuchten Seite zu gelangen, werden die Skripts auf dieser Seite nicht erneut ausgeführt .
Gibt es eine Korrektur / Problemumgehung , damit die Skripte beim zweiten Anzeigen der Seite erneut ausgeführt werden?
Bitte beachten Sie, dass ich dieselben Seiten in Google Chrome und Internet Explorer getestet habe und sie wie vorgesehen funktionieren.
Hier sind die Dateien und die Schritte, mit denen ich das Problem getestet habe:
(Navigieren Sie zu 0.html und klicken Sie, um zu 1.html zu gelangen. Klicken Sie auf die Schaltfläche Zurück.)
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>
quelle
Das ist richtig und das ist gut so.
Wenn Sie in Firefox (und Safari und Opera) auf einen Link klicken, wird Ihre Seite nicht sofort zerstört, um zur nächsten zu gelangen. Es hält die Seite intakt und verbirgt sie lediglich vor der Ansicht. Wenn Sie auf die Schaltfläche "Zurück" klicken, wird die alte Seite wieder angezeigt, ohne dass das Dokument erneut geladen werden muss. Dies ist viel schneller, was zu reibungsloseren Seitenübergängen für den Benutzer führt.
Diese Funktion wird als bfcache bezeichnet .
Alle Inhalte, die Sie der Seite beim vorherigen Laden und Verwenden des Benutzers hinzugefügt haben, sind weiterhin vorhanden. Alle Ereignishandler, die Sie an Seitenelemente angehängt haben, werden weiterhin angehängt. Alle von Ihnen festgelegten Zeitüberschreitungen / Intervalle sind weiterhin aktiv. Es gibt also selten einen Grund, warum Sie wissen müssen, dass Sie versteckt und erneut gezeigt wurden. Es wäre falsch,
onload
Skriptcode erneut aufzurufen oder einzubinden, da jede Bindung und Inhaltsgenerierung, die Sie in dieser Funktion durchgeführt haben, ein zweites Mal über denselben Inhalt ausgeführt wird, was möglicherweise katastrophale Folgen hat. (zBdocument.write
in Inline-Skript würde die Seite völlig zerstören.)Der Grund, warum das Schreiben in
window.onunload
einen Effekt hat, ist, dass die Browser, die bfcache implementieren, entschieden haben, dass - aus Gründen der Kompatibilität mit Seiten, die wirklich wissen müssen, wann sie verworfen werden - jede Seite, die Interesse daran hat, zu wissen, wann sieonunload
auftritt, den bfcache dazu veranlasst deaktiviert sein. Diese Seite wird frisch geladen, wenn Sie zurückkehren, anstatt aus dem bfcache abgerufen zu werden.Wenn Sie also festlegen
window.onunload= function() {};
, brechen Sie den bfcache absichtlich ab. Dies führt dazu, dass Ihre Seiten nur langsam navigieren und nur als letztes Mittel verwendet werden sollten.Wenn Sie wissen müssen, wann der Benutzer Ihre Seite verlässt oder zurückkehrt, ohne den bfcache durcheinander zu bringen, können Sie stattdessen die Ereignisse
onpageshow
und abfangenonpagehide
:quelle
document.ready
funktioniert im Wesentlichen genauso wiewindow.onload
(bei einigen Browsern handelt es sich ohnehin um dasselbe Ereignis).Sie können die
persisted
Eigenschaft despageshow
Ereignisses überprüfen . Es wird beim ersten Laden der Seite auf false gesetzt. Wenn eine Seite aus dem Cache geladen wird, wird sie auf true gesetzt.Aus irgendeinem Grund verfügt jQuery im Ereignis nicht über diese Eigenschaft. Sie können es jedoch vom ursprünglichen Ereignis finden.
quelle
Verdrahten Sie ein "Onunload" -Ereignis, das nichts bewirkt:
quelle
onpopstate
diese Frage vor fast fünf Jahren gestellt wurde, war dieses Ereignis noch relativ neu und die Browserunterstützung war sehr inkonsistentSoweit ich weiß, feuert Firefox kein
onLoad
Ereignis auf dem Rücken ab.Es sollte stattdessen onFocus auslösen, basierend auf diesem Link hier .
quelle
Eine einfache Möglichkeit, eine Seite dazu zu bringen, JavaScript auszuführen, wenn der Benutzer mithilfe des Browserverlaufs zurück zu dieser Seite navigiert, ist das OnPopState-Ereignis. Wir verwenden dies, um das Video auf unserer Homepage ( https://fynydd.com ) anzuhalten und wiederzugeben .
quelle
Für einige Fälle wie Ajax-Operationen kann der URL-Änderungs-Listener verwendet werden
quelle