tromton: onbeforeunload, personalisierter confirm dialog / form submit

Hallo Leute,

ich schreibe gerade eine Datenbank Anwendung für ein Inventar, welche im Intranet einer Firma läuft.
In dieser Anwendung kann man Datensätze ändern, und wenn man einen Datensatz geändert hat und dann von der Seite weggeht (reload, weg navigieren, Fenster schließen) ohne das Formular zu Submitten, fange ich diese Situation ab, indem ich überprüfe, ob das Formular verändert wurde, und wenn ja, kommt eine confirm Meldung die einem die Wahl gibt ob man die Seite verlassen möchte und die Änderungen verliert oder ob man weiter auf der Seite bleiben will.

Nun hat sich bei den ersten Test von Benutzern herausgestellt, das sich viele Benutzer wünschen, das man nicht nur wählen kann zwischen ok und Cancel, sondern das es eine dritte Funktion gibt, die es einem erlaubt die Seite zu verlassen und gleichzeitig die Änderungen im Formular zu speichern.

Mein Ansatz war nun folgender:
Ich Bastel einen eigenen Dialog mit den drei Buttons in einem Div, was bei OnBeforeUnload sichtbar wird und den Unload bis zur Betätigung einer der drei Buttons verzögert.

Hier komm ich nun nicht weiter. Ich habe den Dialog und ich kann einen Submit via Ajax Request abfeuern.

Allerdings weis ich nicht so richtig wie ich den UnLoad entsprechend so lange Pausieren kann bis ich die entsprechend vom Benutzer gewollten Funktionen ausgeführt habe. Ein Anhalten des Vorgangs habe ich bisher nur durch confirm() Dialoge hinbekommen.

Gibt es hier irgendeine Möglichkeit? Gibt es einen anderen Ansatz? Bin Ich auf dem Holzweg?

Ich würde mich sehr freuen, wenn mir jemand eine Richtung andeuten kann.

Vielen Dank,

Tromton

So hatte ich es vorher:

  
	window.onbeforeunload = function(e)  
	{  
		if($($("current_form_id").value).hasClassName('modified') && !$($("current_form_id").value).hasClassName('saving'))  
		{  
			return 'You have unsaved content, would you really like to leave the page? All your changes will be lost.';  
		}  
	};  

Erste Versuche mit der neuen Funktion:

  
function leave_form_dirty_dialogue()  
{  
	var return_value = false;  
	Dialog.info("<table cellspacing=\"10\"><tr><td>You have unsaved content, would you really like to leave the page?<br>All your changes will be lost.<br><br><p align=\"right\"><input type=\"button\" name=\"save\" value=\"SAVE & LEAVE\" id=\"save\" onClick=\"return_value = true;\">&nbsp;<input type=\"button\" name=\"stay\" value=\"STAY\" id=\"stay\" onClick=\"Dialog.okCallback();\">&nbsp;<input type=\"button\" name=\"leave\" value=\"LEAVE & LOOSE\" id=\"leave\" onClick=\"return_value = true;\"></p></td></tr></table>",{className: 'mac_os_x', zIndex: 99, width:320, height:100});  
	return return_value;  
}  
window.onbeforeunload = leave_form_dirty_dialogue();  

  1. Hallo,

    da hast du beforeunload missverstanden. Das einzige, was du tun kannst, ist im beforeunload einen String zurückgeben. Der wird dem Benutzer dann präsentiert in einem Dialog, dessen Aussehen gänzlich vom Browser bestimmt wird. In diesem Dialog kann der Nutzer i.d.R. nur »Seite verlassen« oder »Auf der Seite bleiben« wählen. Darauf hast du keinen Einfluss. Du kannst hier keinen eigenen Event-Handler schreiben, der ein Element einblendet - gut, das kannst du natürlich, aber damit kannst du den Browser nicht davon abhalten, die Seite zu verlassen. Der Dialog, den der Browser anzeigt, bleibt immer derselbe. Da kannst darin keine weiteren Buttons einfügen und mit Ajax-Funktionalität hinterlegen.

    Du musst dir also etwas anderes einfallen lassen. Du könntest beforeunload mit unload kombinieren und im unload-Handler ein confirm() unterbringen. Das wird gefeuert, wenn der Benutzer »Seite verlassen« gewählt hat. Damit könntest du abfragen, ob der Benutzer die Eingaben speichern will, und im positiven Falle einen (synchronen) HTTP-Request absenden. Es ist allerdings nicht garantiert, dass der auch ankommt, schließlich wird gerade die Seite geschlossen und das JavaScript kurz darauf angehalten.

    Mathias

    1. Hallo Mathias,

      Vielen Dank für deine Antwort. Das es so nicht geht deckt sich wohl auch mit meiner bisher erfolglosen Recherche zum Thema. Schade eigentlich.
      gehe ich also auch richtig der annahme, dass man im Falle eines onbeforeunload den unload auch nicht ohne dialog anhalten kann und dann mit einem eigenen script fortfahren kann?
      Im Grunde ist es bei onbeforeunload also schon ausser der hand der website, und der browser hat schon übernommen, richtig?

      Danke für die Hilfe!

      Tromton

  2. Hallo tromton,

    window.onbeforeunload = leave_form_dirty_dialogue();

    ^

    Tippfehler?

    Gruß, Jürgen