JavaScript-Code beim Schließen des Fensters oder beim Aktualisieren der Seite ausführen?

110

Gibt es eine Möglichkeit, einen endgültigen JavaScript-Code auszuführen, wenn ein Benutzer ein Browserfenster schließt oder die Seite aktualisiert?

Ich denke an etwas Ähnliches wie Onload, aber eher an Onclose? Vielen Dank.

Ich mag die Methode onbeforeunload nicht, die immer dazu führt, dass ein Bestätigungsfeld auftaucht (Seite verlassen / auf Mozilla bleiben) oder (neu laden / nicht auf Chrome neu laden). Gibt es eine Möglichkeit, den Code leise auszuführen?

Peter
quelle
1
Mögliches Duplikat: stackoverflow.com/questions/805463/…
1.44mb
18
Warten Sie - dies ist eigentlich kein Duplikat ... Er möchte wissen, wie man etwas ohne Aufforderung an den Benutzer ausführt - die verknüpften Fragen stellen das Gegenteil ...
Phildo

Antworten:

84

Es gibt beide window.onbeforeunloadund window.onunload, die je nach Browser unterschiedlich verwendet werden. Sie können sie entweder zuweisen, indem Sie die Fenstereigenschaften auf Funktionen setzen oder Folgendes verwenden .addEventListener:

window.onbeforeunload = function(){
   // Do something
}
// OR
window.addEventListener("beforeunload", function(e){
   // Do something
}, false);

Wird normalerweise onbeforeunloadverwendet, wenn Sie verhindern müssen, dass der Benutzer die Seite verlässt (z. B. arbeitet der Benutzer an einigen nicht gespeicherten Daten, daher sollte er diese vor dem Verlassen speichern). onunloadwird von Opera meines Wissens nicht unterstützt , aber Sie können immer beides einstellen.

JCOC611
quelle
Das hat bei mir funktioniert: Firefox (69.0.2) und Chrome (77.0.3865.90)
FelipeCaparelli
51

Ok, ich habe eine funktionierende Lösung dafür gefunden. Sie besteht darin, das beforeunloadEreignis zu verwenden und dann den Handler zurückzubringen null. Dadurch wird der gewünschte Code ausgeführt, ohne dass ein Bestätigungsfeld angezeigt wird. Es geht ungefähr so:

window.onbeforeunload = closingCode;
function closingCode(){
   // do something...
   return null;
}

Hoffe das hilft.

Peter
quelle
10
Wird dies nicht auch beim Navigieren und beim Aktualisieren ausgelöst (F5)? Wenn ja, geht es nicht wirklich um die Frage ...
Jago
1
Nicht getestet, aber ich denke, return false;macht das gleiche (dh verhindert das Standardverhalten) und es ist semantisch korrekter.
Collimarco
1
return false öffnet weiterhin das Dialogfeld und fragt, ob Sie die Seite verlassen möchten oder nicht. Ich habe es an einem Anker getestet. Mit return null wurde der Dialog nicht angezeigt, aber es wurde immer noch die console.log
Ricky Stam
20

Manchmal möchten Sie den Server möglicherweise darüber informieren, dass der Benutzer die Seite verlässt. Dies ist beispielsweise nützlich, um nicht gespeicherte Bilder zu bereinigen, die vorübergehend auf dem Server gespeichert sind, um diesen Benutzer als "offline" zu markieren oder um zu protokollieren, wenn die Sitzung beendet ist.

In der Vergangenheit haben Sie eine AJAX-Anforderung in der beforeunloadFunktion gesendet , dies hat jedoch zwei Probleme. Wenn Sie eine asynchrone Anforderung senden, gibt es keine Garantie dafür, dass die Anforderung korrekt ausgeführt wird. Wenn Sie eine synchrone Anfrage senden, ist diese zuverlässiger, aber der Browser bleibt hängen, bis die Anfrage abgeschlossen ist. Wenn dies eine langsame Anfrage ist, wäre dies eine große Unannehmlichkeit für den Benutzer.

Zum Glück haben wir jetzt navigator.sendBeacon(). Mithilfe dieser sendBeacon()Methode werden die Daten asynchron an den Webserver übertragen, wenn der Benutzeragent die Möglichkeit dazu hat, ohne das Entladen zu verzögern oder die Leistung der nächsten Navigation zu beeinträchtigen. Dies löst alle Probleme bei der Übermittlung von Analysedaten: Die Daten werden zuverlässig gesendet, asynchron gesendet und haben keinen Einfluss auf das Laden der nächsten Seite. Hier ist ein Beispiel für seine Verwendung:

window.addEventListener("unload", logData, false);

function logData() {
  navigator.sendBeacon("/log.php", analyticsData);
}

sendBeacon()wird unterstützt in:

  • Kante 14
  • Firefox 31
  • Chrome 39
  • Safari 11.1
  • Oper 26
  • iOS Safari 11.4

Es wird derzeit NICHT unterstützt in:

  • Internet Explorer
  • Opera Mini

Hier ist eine Polyfüllung für sendBeacon (), falls Sie Unterstützung für nicht unterstützte Browser hinzufügen müssen. Wenn die Methode im Browser nicht verfügbar ist, wird stattdessen eine synchrone AJAX-Anforderung gesendet.

Mike
quelle
Diese Frage befand sich im Rahmen des Falls "Senden einer Anfrage an den Server". Die Idee war, in der Lage zu sein, geöffnete Tabs pro Benutzer im Auge zu behalten und im Backend zu bereinigen, wenn ein Tab geschlossen wird.
Peter
@ Peter Ich habe es der Vollständigkeit halber aufgenommen, aber ich habe es gelöscht.
Mike
@ Mike, bitte löschen Sie Ihre Antwort NICHT. Es vervollständigt nicht nur die ausgewählte beste Antwort (es sollte Ihre sein), sondern präsentiert auch das Ereignis, das zum Abfangen oder Schließen des Fensters verwendet wird
Alex8752
@ Alex8752 Ich habe meine Antwort nicht gelöscht, sondern einen Teil davon herausgeschnitten, der für die Frage irrelevant war, die Sie hier anzeigen können .
Mike
1
@AshokKumar Sie haben die Kontrolle darüber, was Sie an den Server senden. Wenn Sie Dinge per GET senden möchten, hindert Sie nichts daran, Ihre Anfrage an etwas wie http://example.com/script.php?token=something&var1=val1&var2=val2das Senden dieser Werte in GET zu senden .
Mike
14

jQuery-Version:

$(window).unload(function(){
    // Do Something
});

Update : jQuery 3:

$(window).on("unload", function(e) {
    // Do Something
});

Danke Garrett

Paras
quelle
8

In der Dokumentation hier wird empfohlen, das Ereignis onbeforeunload abzuhören und / oder einen Ereignis-Listener im Fenster hinzuzufügen.

window.addEventListener('beforeunload', function(event) {
  //do something here
}, false);

Sie können auch einfach die Eigenschaften .onunload oder .onbeforeunload des Fensters mit einer Funktion oder einer Funktionsreferenz füllen.

Obwohl das Verhalten nicht für alle Browser standardisiert ist, gibt die Funktion möglicherweise einen Wert zurück, den der Browser anzeigt, wenn bestätigt wird, ob die Seite verlassen werden soll.

Davejoem
quelle
7

Sie können verwenden window.onbeforeunload.

window.onbeforeunload = confirmExit;
function confirmExit(){
    alert("confirm exit is being called");
    return false;
}
Gurpreet Singh
quelle
3

Das Ereignis wird aufgerufen beforeunload, sodass Sie eine Funktion zuweisen können window.onbeforeunload.

Phssthpok
quelle
-2

Sie können so etwas ausprobieren:

<SCRIPT language="JavaScript">
<!--
function loadOut()
{
window.location="http://www.google.com";
}
//-->
</SCRIPT>

<body onBeforeUnload="loadOut()">
Däne Balia
quelle
23
Achtung, Leute, die dies in nicht alten Zeiten lesen - dies ist altes JS und HTML und die anderen Vorschläge hier sind viel besser.
RAnders00