
In meinem Seminar über Webentwicklung kam die Frage auf, ob man abfangen kann, wenn ein Benutzer das Browserfenster – oder den aktuellen Tab – schließt, um so bspw. eine aktive Session zu beenden. Das wäre dann ja wohl der Event-Handler onClose, nur leider ist dieser in kaum einem Browser verfügbar.
Es gibt den Event-Handler onUnload, aber der ist für den angedachten Zweck nicht direkt zu gebrauchen, denn onUnload feuert wann immer man eine Seite verlässt oder erneut lädt.
In ein paar älteren Artikeln fand ich eine Idee, die zwar den onUnload Event-Handler nutzt, aber nur feuert, wenn Höhe und Breite des Fensters kleiner 0 sind – also kein Fenster (oder Tab) mehr vorhanden ist. Unglaublich, aber wahr: Das funktioniert – aber so eben nur im Internet Explorer. Mit ein paar Änderungen läuft das ganze auch im FireFox (getestet auf FF 3.5.5):
//einfaches binden von events, nur damit das script laeuft...
function listen(evnt, elem, func) {
if (elem.addEventListener) {
elem.addEventListener(evnt,func,false);
} else if (elem.attachEvent) {
var r = elem.attachEvent("on"+evnt, func);
return r;
}
}
// die onclose Implementierung...
function checkClosed(e) {
var e = e || window.event;
var closed = false;
if(window.innerWidth != undefined && window.innerWidth <= 0) {
//ff
closed = true;
} else if(e != undefined &&
e.clientY != undefined && e.clientY <= 0) {
//ie
closed = true;
}
if(closed) {
//feuert nur dann, wenn das fenster geschlossen wird...
[...]
}
}
// und binden der funktion an den event unload
listen('unload',checkClosed);Eine ernstzunehmende Lösung ist das aber nicht, so kann das Script bspw. nicht abfangen, ob ein Benutzer schlichtweg eine neue URL eingibt, oder die Anwendung über ALT+F4 beendet. Und unterstützt werden auch nur Internet Explorer und FireFox – Google Chrome, Opera und Safari lassen sich auf diese Weise nicht um ein “onClose” erweitern.
Um eine aktive Session dennoch nicht zu lange aufrecht zu erhalten, hilft es, den entsprechenden Wert in der PHP.ini anzupassen (session.gc_maxlifetime), das ist zwar nicht so exakt, aber erfüllt seinen Zweck, ganz unabhängig von JavaScript.
