it-swarm.com.de

Nachdem Sie in die Firefox-Historie zurückgekehrt sind, wird JavaScript nicht ausgeführt

Wenn ich die Zurück-Schaltfläche in Firefox verwende, um eine zuvor besuchte Seite zu erreichen, werden Skripts auf dieser Seite nicht mehr ausgeführt .

Gibt es einen Fix/Workaround , um die Skripts erneut auszuführen, wenn die Seite das zweite Mal angezeigt wird?

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, die ich zum Testen des Problems verwendet habe:

(navigieren Sie zu 0.html, klicken Sie, um zu 1.html zu gelangen, 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>
73
Patonza

Legt eine leere Funktion fest, die unter window.onunload aufgerufen werden soll:

window.onunload = function(){}; 

z.B.

<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>

Source:http://www.firefoxanswer.com/firefox/672-firefoxanswer.html(Archivierte Version)

84
fig

Wenn ich die Zurück-Schaltfläche in Firefox verwende, um eine zuvor besuchte Seite zu erreichen, werden Skripts auf dieser Seite nicht mehr ausgeführt.

Das ist richtig und das ist auch 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. Dadurch bleibt die Seite intakt und blendet sie nur aus. Wenn Sie die Zurück-Taste drücken, wird die alte Seite wieder angezeigt, ohne dass das Dokument erneut geladen werden muss. Dies ist viel schneller und führt zu sanfteren Seitenübergängen für den Benutzer.

Diese Funktion wird als bfcache bezeichnet.

Alle Inhalte, die Sie während des vorherigen Ladens und der Verwendung des Benutzers zur Seite hinzugefügt haben, sind weiterhin vorhanden. Event-Handler, die Sie an Seitenelemente angehängt haben, werden weiterhin angefügt. Alle von Ihnen festgelegten Zeitüberschreitungen/Intervalle sind weiterhin aktiv. Es gibt also kaum einen Grund, warum Sie wissen müssen, dass Sie verborgen und erneut gezeigt wurden. Es wäre falsch, onload oder Inline-Skriptcode erneut aufzurufen, da alle Bindungen und Inhaltsgenerierungen, die Sie in dieser Funktion vorgenommen haben, ein zweites Mal für denselben Inhalt ausgeführt werden, was katastrophale Folgen haben kann. (zB document.write in Inline-Skript würde die Seite vollständig zerstören.)

Der Grund für das Schreiben an window.onunload 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 sollen, jede Seite, die ein Interesse daran hat, zu wissen, wann onunload auftritt, dies verursacht bfcache muss deaktiviert sein. Diese Seite wird neu geladen, wenn Sie dorthin zurückkehren, anstatt vom bfcache abgerufen zu werden.

Wenn Sie also window.onunload= function() {}; einstellen, wird der bfcache absichtlich beschädigt. Dies führt dazu, dass Ihre Seiten nur langsam navigiert werden und nicht als letzter Ausweg verwendet werden sollten.

Wenn Sie wissen müssen, wann der Benutzer Ihre Seite verlässt oder zu Ihrer Seite zurückkehrt, ohne den bfcache zu stören, können Sie stattdessen die Ereignisse onpageshow und onpagehide abfangen:

window.onload=window.onpageshow= function() {
    alert('Hello!');
};
66
bobince

Sie können die persisted-Eigenschaft des pageshow-Ereignisses überprüfen. Beim ersten Laden der Seite wird es auf false gesetzt. Wenn die Seite aus dem Cache geladen wird, wird sie auf true gesetzt.

window.onpageshow = function(event) {
    if (event.persisted) {
        alert("From bfcache");
    }
};

Aus irgendeinem Grund hat jQuery diese Eigenschaft in dem Ereignis nicht. Sie können es jedoch vom ursprünglichen Ereignis finden.

$(window).bind("pageshow", function(event) {
    if (event.originalEvent.persisted) {
        alert("From bfcache");
    }
});
19
Mika Tuupola

Verbinden Sie sich in einem "Onunload" -Ereignis, das nichts bewirkt:

<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>
1
Chris Haas

Soweit ich weiß, feuert Firefox kein onLoad Ereignis ab 

Es sollte onFocus statt dessen auslösen hier .

1
systempuntoout

Das OnPopState-Ereignis ist eine einfache Möglichkeit, eine Seite dazu zu veranlassen, dass JavaScript ausgeführt wird, wenn der Benutzer mithilfe des Browserverlaufs zurück zu ihm navigiert. Wir verwenden dies, um das Video auf unserer Homepage ( https://fynydd.com ) anzuhalten und wiederzugeben.

window.onpopstate = function() {

    // Do stuff here...
};
1
Michael A.

in einigen Fällen, z. B. bei ajax-Vorgängen, kann ein Listener mit Änderungslisten verwendet werden 

$(window).on('hashchange', function() {
        ....
});
0
Tamer