onbeforeunload mit Ajax
Nasirea
- javascript
0 ritschmanhard0 Sven Rautenberg0 molily
1 molily
Hallo Forum,
seit mittlerweile drei Tagen wurschtle ich an einem Problem herum, dass mich in den Wahnsinn treibt!
Folgender Sachverhalt:
Beim verlassen der Seite sollen verschiedene Einstellungen des Users über Ajax in eine Datenbank geschrieben werden. Als event verwende ich onunload und onbeforeunload.
Das klappt soweit auch ganz gut, nur für den Firefox muss ich der aufgerufenen funktion ein return true/false hinzufügen damit der abschließende Schritt auch ausgelöst wird.
Firefox führt die Funktion dann aus, aber:
Jetzt erscheint durch den Rückgabe-Parameter bei jedem Klick auf einem Hyperlink "Möchten Sie wirklich diese Seite verlassen?".
Diese Meldung nervt unheimlich und ich würde sie gerne unterdrücken/vermeiden/umgehen.
Hat jemand eine Idee?
P.S.: Auch wenn ich Asynchron auf false stelle (bei Ajax) wird der request nicht abgesetzt bzw. abgebrochen, wenn ich den Rückgabe Parameter weglasse.
Hier der Code-Snippet:
window.onbeforeunload=Verlassen;
function Verlassen()
{
AjaxSend("save.asp","Hans=Wurst&Bush=doof","POST",false);
return 0; // Wenn ich das weglasse wird die Funktion im FF nicht abgeschlossen!
}
function AjaxSend(url,ParaData,SendMethod,bolAsynchronos)
{
http_request = false;
if (window.XMLHttpRequest)
{ // Mozilla, Safari,...
http_request = new XMLHttpRequest();
}
else if (window.ActiveXObject)
{ // IE
try
{http_request = new ActiveXObject("Msxml2.XMLHTTP");}
catch (e)
{try
{http_request = new ActiveXObject("Microsoft.XMLHTTP");}
catch (e) {}
}
}
if (!http_request)
{
return false;
}
http_request.open(SendMethod, url, bolAsynchronus);
http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http_request.setRequestHeader("Content-length", params.length);
http_request.setRequestHeader("Connection", "close");
}
http_request.onreadystatechange = FertigGeladen;
http_request.send(params);
}
Warum kommt unter FF diese doofe Meldung und wie kann ich sie umgehen?
Für einen Tip wäre ich echt dankbar
Hi Nasirea!
Folgendes ist mir nicht klar:
function doSave()
{
//werte setzen hier...
//und dann submitten
document.saver.submit()
}
<form name="saver" id="loader" action="save.asp" method="post" style="display:none;">
<input type="text" name="hans" value="wurst" />
</form>
<body onunload="doSave()">
Grüße,
Richard
P.S. Der return false bei onbeforeunload legt fest, dass der user gefragt werden soll, ob ein Verlassen der Seite gewünscht ist. Diese Meldung lässt sich (nach meinem Kenntnisstand) nicht unterdrücken, sondern nur ergänzen, indem statt return false dann return "ergänzung" zurückzugeben ist.
Moin!
Folgender Sachverhalt:
Beim verlassen der Seite sollen verschiedene Einstellungen des Users über Ajax in eine Datenbank geschrieben werden. Als event verwende ich onunload und onbeforeunload.
Ganz schlechte Idee eigentlich.
Speichere die Daten in dem Moment, wo sie vom User eingegeben bzw. geändert werden, nicht irgendwann später. Dazu ist AJAX gut geeignet, und du bist zu 99,9% sicher, dass dir keine Daten verloren gehen. Wenn du wartest, bis die Seite "verlassen" wird, gehen dir potentiell deutlich mehr Daten verloren, weil Browser, Betriebssysteme oder Internetleitungen auch einfach mal sang- und klanglos abstürzen oder unverfügbar werden können.
Mit zeitnaher Speicherung hast du drei Fliegen mit einer Klappe geschlagen: 1. Kannst du dem User für den Fall, dass das Speichern gescheitert ist, direkt eine Rückmeldung dazu geben, 2. hast du die aktuellstmöglichen Daten gespeichert und 3. mußt du dich nicht mit den sehr fragwürdigen Eventhandlern "onunload" bzw. (gibts sowieso nur im IE) "onbeforeunload" herumschlagen und mit diese unsinnigen Nachfragen den User nerven.
- Sven Rautenberg
Hallo,
- Kannst du dem User für den Fall, dass das Speichern gescheitert ist, direkt eine Rückmeldung dazu geben, 2. hast du die aktuellstmöglichen Daten gespeichert und 3. mußt du dich nicht mit den sehr fragwürdigen Eventhandlern "onunload" bzw. (gibts sowieso nur im IE) "onbeforeunload" herumschlagen
Stimmt nicht, andere Browser kennen sie auch.
Dein Vorschlag ist richtig, aber dieses Vorgehen macht nimmt unload und beforeunload weder die Notwendigkeit noch die Nützlichkeit.
und mit diese unsinnigen Nachfragen den User nerven.
Die sind überhaupt nicht unsinnig. Schau dir einmal an, wie die Events bei Google Documents verwendet werden. Da wird natürlich jede Änderung direkt zum Server übertragen, aber wenn das Server-Okay noch nicht da ist, wird das Schließen des Fensters mit beforeunload »gesperrt«. Dann kann man aufs automatische Speichern warten oder direkt »Speichern und schließen« klicken.
Mathias
Hallo,
Jetzt erscheint durch den Rückgabe-Parameter bei jedem Klick auf einem Hyperlink "Möchten Sie wirklich diese Seite verlassen?".
Diese Meldung nervt unheimlich und ich würde sie gerne unterdrücken/vermeiden/umgehen.
Diese Meldung nervt nicht, sondern ist der ganze Sinn von »onbeforeunload«! Dann bist du eher auf dem falschen Dampfer.
Wenn du ein nur einen Ajax-Request beim Verlassen absenden willst, du kannst du das (ob mit unload oder beforeunload), aber kannst dir nicht sicher sein, ob der Browser das auch ausführt und den Request absendet.
Hat jemand eine Idee?
Ja: Deine Webanwendung umstellen. Siehe Sven.
Änderungen speichern, sobald sie vorgenommen werden.
Mit onbeforeunload und der besagten Meldung kannst du dann den Fall abfangen, dass eine Änderung noch nicht zum Server übertragen wurde. Dann kannst du den Benutzer bitten, die Änderungen zu speichern bzw. es erneut versuchen.
Warum kommt unter FF diese doofe Meldung und wie kann ich sie umgehen?
Weil der beforeunload-Event für diese »doofe Meldung« erfunden wurde! Das ist sein Vorteil.
Mathias