Gibt es einen browserübergreifenden JavaScript / jQuery-Code, der erkennt, ob der Browser oder eine Browser-Registerkarte geschlossen wird, jedoch nicht aufgrund eines geklickten Links?
javascript
jquery
Cometta
quelle
quelle
sessionStorage
Property, es läuft ab, sobald der Browser geschlossen wird. w3schools.com/jsref/prop_win_sessionstorage.aspAntworten:
Wenn ich Sie richtig verstehe, möchten Sie wissen, wann ein Tab / Fenster effektiv geschlossen wird. Nun, AFAIK der einzige Weg
Javascript
, um solche Dinge zu erkennen, sindonunload
&onbeforeunload
Ereignisse.Leider (oder zum Glück?) Werden diese Ereignisse auch ausgelöst, wenn Sie eine Site über eine
link
oder die Zurück-Schaltfläche Ihres Browsers verlassen. Das ist also die beste Antwort, die ich geben kann. Ich glaube nicht, dass Sie ein reinesclose
Javascript nativ erkennen können . Korrigieren Sie mich, wenn ich hier falsch liege.quelle
String
Rückgabewert von entferntonbeforeunload
. Jetzt können Sie vor dem Entladen keine benutzerdefinierte Nachricht mehr anzeigen.unload
?Aus der Firefox-Dokumentation
Aus bestimmten Gründen folgen Webkit-basierte Browser nicht den Spezifikationen für das Dialogfeld. Ein fast übergreifendes Beispiel wäre dem folgenden Beispiel sehr ähnlich.
Dieses Beispiel für die Handhabung aller Browser.
quelle
Einfache Lösung
quelle
// Dies funktioniert in IE7, wenn Sie einen Tab oder Browser mit nur einem Tab schließen
quelle
window.onunload = "alert('wait')"
undwindow.onbeforeunload = "alert('wait... chrome!')"
verwendet, aber keine ausgelöst, als ich die Registerkarte geschlossen habe.window.onunload = "alert('wait')"
und so etwas sollte eigentlich nicht funktionieren. "Die Funktion sollte der returnValue-Eigenschaft des Event-Objekts einen Zeichenfolgenwert zuweisen und dieselbe Zeichenfolge zurückgeben." Bitte werfen Sie einen Blick auf MDN ArtikelIch musste den Benutzer automatisch abmelden, wenn der Browser oder die Registerkarte geschlossen wird, aber nicht, wenn der Benutzer zu anderen Links navigiert. Ich wollte auch nicht, dass eine Bestätigungsaufforderung angezeigt wird, wenn dies passiert. Nachdem ich eine Weile damit zu kämpfen hatte, insbesondere mit IE und Edge, habe ich Folgendes getan (überprüft, ob ich mit IE 11, Edge, Chrome und Firefox arbeite), nachdem ich den Ansatz anhand dieser Antwort begründet hatte .
Starten Sie zunächst einen Countdown-Timer auf dem Server in der
beforeunload
Ereignisbehandlungsroutine in JS. Die Ajax-Aufrufe müssen synchron sein, damit IE und Edge ordnungsgemäß funktionieren. Sie müssen auch verwendenreturn;
, um zu verhindern, dass der Bestätigungsdialog wie folgt angezeigt wird:Durch Starten des Timers wird das
cancelLogout
Flag auf false gesetzt . Wenn der Benutzer die Seite aktualisiert oder zu einem anderen internen Link navigiert, wird dascancelLogout
Flag auf dem Server auf true gesetzt . Nach Ablauf des Timer-Ereignisses überprüft es dascancelLogout
Flag, um festzustellen, ob das Abmeldeereignis abgebrochen wurde. Wenn der Timer abgebrochen wurde, wird der Timer gestoppt. Wenn der Browser oder die Registerkarte geschlossen würde,cancelLogout
würde das Flag falsch bleiben und der Ereignishandler würde den Benutzer abmelden.Implementierungshinweis: Ich verwende ASP.NET MVC 5 und brich die Abmeldung in einer überschriebenen
Controller.OnActionExecuted()
Methode ab.quelle
OnActionExecuted
?Leider konnte ich einer vorhandenen Antwort keinen Kommentar hinzufügen, aber falls Sie eine Art Warndialog implementieren möchten, wollte ich nur erwähnen, dass jede Ereignishandlerfunktion ein Argument - Ereignis hat. In Ihrem Fall können Sie event.preventDefault () aufrufen, um das automatische Verlassen der Seite zu verhindern, und dann Ihren eigenen Dialog auslösen. Ich halte dies für eine weitaus bessere Option als die Verwendung eines hässlichen und unsicheren Standardalarms (). Ich persönlich habe meine eigenen Dialogfelder basierend auf dem kendoWindow-Objekt implementiert (Teleriks Kendo-Benutzeroberfläche, die mit Ausnahme von kendoGrid und kendoEditor fast vollständig Open-Source ist). Sie können auch Dialogfelder über die jQuery-Benutzeroberfläche verwenden. Beachten Sie jedoch, dass solche Dinge asynchron sind und Sie einen Handler an das Onclick-Ereignis jeder Schaltfläche binden müssen. Dies ist jedoch recht einfach zu implementieren.
Ich stimme jedoch zu, dass das Fehlen des Real-Close-Ereignisses schrecklich ist: Wenn Sie beispielsweise Ihren Sitzungsstatus im Back-End nur im Falle des Real-Close-Ereignisses zurücksetzen möchten, ist dies ein Problem.
quelle
Bei ähnlichen Aufgaben können Sie
sessionStorage
Daten lokal speichern, bis die Registerkarte Browser geschlossen wird.Das
sessionStorage
Objekt speichert Daten nur für eine Sitzung (die Daten werden gelöscht, wenn die Registerkarte Browser geschlossen wird). ( W3Schools )Das ist mein Stift .
quelle
Es gibt kein Ereignis, aber es gibt eine Eigenschaft,
window.closed
die zum Zeitpunkt dieses Schreibens in allen gängigen Browsern unterstützt wird. Wenn Sie also wirklich wissen müssen, können Sie das Fenster abfragen, um diese Eigenschaft zu überprüfen.if(myWindow.closed){do things}
Hinweis: Das Abrufen von Daten ist im Allgemeinen nicht die beste Lösung. Das
window.onbeforeunload
Ereignis sollte nach Möglichkeit verwendet werden. Die einzige Einschränkung besteht darin, dass es auch ausgelöst wird, wenn Sie weg navigieren.quelle
quelle
beforeunload
, eine Warnung anzuzeigen. So:$(window).on('beforeunload', function(){ alert ('Bye now')});
Versuchen Sie es zu benutzen:
quelle
Ich habe einen Weg gefunden, der auf allen meinen Browsern funktioniert .
Getestet mit folgenden Versionen: Firefox 57, Internet Explorer 11, Edge 41, eines der neuesten Chrome (meine Version wird nicht angezeigt)
quelle
Da es noch niemand erwähnt hat (8+ Jahre später): Ein WebSocket kann eine weitere effektive Möglichkeit sein, einen geschlossenen Tab zu erkennen. Solange die Registerkarte geöffnet ist und auf den Host zeigt, kann der Client eine aktive WebSocket-Verbindung zum Host aufrechterhalten.
Vorsichtsmaßnahme: Bitte beachten Sie, dass diese Lösung für ein Projekt nur dann realisierbar ist, wenn für ein WebSocket kein zusätzlicher erheblicher Aufwand erforderlich ist.
Innerhalb eines angemessenen Zeitlimits (z. B. 2 Minuten) kann die Serverseite feststellen, dass der Client nach dem Trennen des WebSocket nicht mehr verfügbar ist, und alle gewünschten Aktionen ausführen, z. B. das Entfernen hochgeladener temporärer Dateien. (In meinem äußerst speziellen Anwendungsfall bestand mein Ziel darin, einen localhost-App-Server drei Sekunden nach dem Verbindungsabbruch der WebSocket-Verbindung und dem Beenden aller CGI / FastCGI-Aktivitäten zu beenden. Alle anderen Keep-Alive-Verbindungen wirken sich nicht auf mich aus.)
Ich hatte Probleme, den Onunload-Ereignishandler dazu zu bringen, ordnungsgemäß mit Beacons zu arbeiten (wie in dieser Antwort empfohlen ). Das Schließen der Registerkarte schien das Beacon nicht auszulösen, und das Öffnen von Registerkarten löste es auf eine Weise aus, die möglicherweise Probleme verursachen könnte. Ein WebSocket löste das Problem, auf das ich stieß, sauberer, da die Verbindung ungefähr zur gleichen Zeit geschlossen wird, zu der die Registerkarte geschlossen wird und das Wechseln der Seiten innerhalb der Anwendung einfach eine neue WebSocket-Verbindung innerhalb des Verzögerungsfensters öffnet.
quelle
JSFiddle Link
Hallo zusammen, ich konnte die Klicks "Browser erkennen und Tab schließen" mithilfe des lokalen Speichers und des Zeitstempels des Browsers erzielen. Ich hoffe, Sie alle werden Ihre Probleme mit dieser Lösung lösen.
Nach meiner ersten Recherche stellte ich fest, dass der Browser beim Schließen eines Browsers alle Registerkarten nacheinander schließt, um den Browser vollständig zu schließen. Daher habe ich festgestellt, dass zwischen dem Schließen der Registerkarten nur eine sehr geringe Zeitverzögerung liegt. Daher habe ich diese Zeitverzögerung als Hauptüberprüfungspunkt verwendet und konnte die Ereigniserkennung für das Schließen von Browsern und Registerkarten erreichen.
Ich habe es auf Chrome Browser Version 76.0.3809.132 getestet und festgestellt, dass es funktioniert
:) Stimmen Sie ab, wenn Sie meine Antwort hilfreich fanden ....
quelle
quelle
here also can be string, that will be shown to the user
Auf Firefox ist dies jedoch nicht in Chrome derEs ist möglich, dies mit Hilfe von window.closed in einem Ereignishandler beim Entladen eines solchen Ereignisses zu überprüfen, es ist jedoch eine Timeout-Verwendung erforderlich (daher kann das Ergebnis nicht garantiert werden, wenn sich etwas verzögert oder das Schließen des Fensters verhindert):
Beispiel für JSFiddle (getestet auf den neuesten Versionen von Safari, FF, Chrome, Edge und IE11)
quelle
Ich habe alle oben genannten Lösungen ausprobiert, keine davon hat wirklich für mich funktioniert, insbesondere weil es in meinem Projekt einige Telerik-Komponenten gibt, die über die Schaltfläche "Schließen" für Popup-Fenster verfügen und das Ereignis "vor dem Herunterladen" aufrufen. Außerdem funktioniert die Schaltflächenauswahl nicht ordnungsgemäß, wenn Ihre Seite ein Telerik-Raster enthält (ich meine Schaltflächen innerhalb des Rasters). Daher konnte ich keinen der oben genannten Vorschläge verwenden. Schließlich ist dies die Lösung, die für mich funktioniert hat. Ich habe ein onUnload-Ereignis zum Body-Tag von _Layout.cshtml hinzugefügt. Etwas wie das:
Fügen Sie dann die LogOff-Funktion hinzu, um zu Account / LogOff umzuleiten, einer in Asp.Net MVC integrierten Methode. Wenn ich jetzt den Browser oder die Registerkarte schließe, wird zur LogOff-Methode umgeleitet, und der Benutzer muss sich bei der Rückkehr anmelden. Ich habe es sowohl in Chrome als auch in Firefox getestet. Und es funktioniert!
quelle
Diese Funktion zeigt ein Bestätigungsdialogfeld an, wenn Sie während eines Vorgangs im Browser das Fenster schließen oder die Seite aktualisieren. Diese Funktion funktioniert in allen Browsern. Sie müssen isProcess var in Ihrem Ajax-Prozess festlegen.
quelle
quelle
sendkeylog
?Wie @jAndy erwähnt hat, gibt es keinen richtigen Javascript-Code, um zu erkennen, dass ein Fenster geschlossen wird. Ich ging von dem aus, was @Syno vorgeschlagen hatte.
Ich habe eine solche Situation durchlaufen und vorausgesetzt, Sie befolgen diese Schritte, können Sie sie erkennen.
Ich habe es auf Chrome 67+ und Firefox 61+ getestet.
};
quelle
resize
wenn das Fenster unscharf ist. Wenn es 100x unscharf wird, haben Sie 100 Listener, was den Browser verlangsamt.Versuchen Sie dies, ich bin sicher, dass dies für Sie funktionieren wird.
quelle
Versuche dies. Es wird klappen. Die jquery-Entlademethode ist veraltet.
quelle