Kurze, falsche Antwort:
Sie können dies tun, indem Sie das beforeunload
Ereignis behandeln und eine Nicht-Null-Zeichenfolge zurückgeben :
window.addEventListener("beforeunload", function (e) {
var confirmationMessage = 'It looks like you have been editing something. '
+ 'If you leave before saving, your changes will be lost.';
(e || window.event).returnValue = confirmationMessage; //Gecko + IE
return confirmationMessage; //Gecko + Webkit, Safari, Chrome etc.
});
Das Problem bei diesem Ansatz besteht darin, dass beim Senden eines Formulars auch das Entladeereignis ausgelöst wird . Dies lässt sich leicht beheben, indem Sie ein Flag hinzufügen, mit dem Sie ein Formular senden:
var formSubmitting = false;
var setFormSubmitting = function() { formSubmitting = true; };
window.onload = function() {
window.addEventListener("beforeunload", function (e) {
if (formSubmitting) {
return undefined;
}
var confirmationMessage = 'It looks like you have been editing something. '
+ 'If you leave before saving, your changes will be lost.';
(e || window.event).returnValue = confirmationMessage; //Gecko + IE
return confirmationMessage; //Gecko + Webkit, Safari, Chrome etc.
});
};
Rufen Sie dann den Setter an, wenn Sie senden:
<form method="post" onsubmit="setFormSubmitting()">
<input type="submit" />
</form>
Aber lesen Sie weiter ...
Lange, richtige Antwort:
Sie möchten diese Nachricht auch nicht anzeigen, wenn der Benutzer in Ihren Formularen nichts geändert hat . Eine Lösung besteht darin, das beforeunload
Ereignis in Kombination mit einem "schmutzigen" Flag zu verwenden, das die Eingabeaufforderung nur dann auslöst, wenn es wirklich relevant ist.
var isDirty = function() { return false; }
window.onload = function() {
window.addEventListener("beforeunload", function (e) {
if (formSubmitting || !isDirty()) {
return undefined;
}
var confirmationMessage = 'It looks like you have been editing something. '
+ 'If you leave before saving, your changes will be lost.';
(e || window.event).returnValue = confirmationMessage; //Gecko + IE
return confirmationMessage; //Gecko + Webkit, Safari, Chrome etc.
});
};
Um die isDirty
Methode zu implementieren , gibt es verschiedene Ansätze.
Sie können jQuery und Formularserialisierung verwenden , dieser Ansatz weist jedoch einige Mängel auf. Zuerst müssen Sie den Code ändern, damit er in einem beliebigen Formular funktioniert ( $("form").each()
funktioniert), aber das größte Problem ist, dass jQuery's serialize()
nur für benannte, nicht deaktivierte Elemente funktioniert. Wenn Sie also ein deaktiviertes oder nicht benanntes Element ändern, wird das Dirty-Flag nicht ausgelöst. Hierfür gibt es Problemumgehungen, z. B. das schreibgeschützte Erstellen von Steuerelementen anstelle des Aktivierens, Serialisierens und anschließenden erneuten Deaktivierens der Steuerelemente.
Ereignisse scheinen also der richtige Weg zu sein. Sie können versuchen , auf Tastendrücke zu warten . Diese Veranstaltung hat einige Probleme:
- Wird nicht bei Kontrollkästchen, Optionsfeldern oder anderen Elementen ausgelöst, die durch Mauseingabe geändert werden.
- Wird für irrelevante Tastendrücke wie die CtrlTaste ausgelöst .
- Wird bei Werten, die über JavaScript-Code festgelegt wurden, nicht ausgelöst.
- Wird beim Ausschneiden oder Einfügen von Text über Kontextmenüs nicht ausgelöst.
- Funktioniert nicht für virtuelle Eingaben wie Datepicker oder Checkbox- / Radiobutton-Verschönerer, die ihren Wert in einer versteckten Eingabe über JavaScript speichern.
Das change
Ereignis wird auch nicht bei Werten ausgelöst, die aus JavaScript-Code festgelegt wurden , und funktioniert daher auch nicht für virtuelle Eingaben.
Das Binden des input
Ereignisses an alle input
s (und textarea
s und select
s) auf Ihrer Seite funktioniert in älteren Browsern nicht und unterstützt wie alle oben genannten Ereignisbehandlungslösungen das Rückgängigmachen nicht. Wenn ein Benutzer ein Textfeld ändert und dieses dann rückgängig macht oder ein Kontrollkästchen aktiviert und deaktiviert, wird das Formular weiterhin als fehlerhaft betrachtet.
Und wenn Sie mehr Verhalten implementieren möchten, z. B. bestimmte Elemente ignorieren, haben Sie noch mehr Arbeit zu erledigen.
Das Rad nicht neu erfinden:
Bevor Sie über die Implementierung dieser Lösungen und aller erforderlichen Problemumgehungen nachdenken, stellen Sie fest, dass Sie das Rad neu erfinden und auf Probleme stoßen, die andere bereits für Sie gelöst haben.
Wenn Ihre Anwendung bereits jQuery verwendet, können Sie auch getesteten, gepflegten Code verwenden, anstatt Ihren eigenen zu rollen, und für all dies eine Bibliothek eines Drittanbieters verwenden. jQuery's Bist du sicher? Plugin funktioniert super, siehe ihre Demo-Seite . So einfach ist das:
<script src="jquery.are-you-sure.js"></script>
<script>
$(function() {
$('#myForm').areYouSure(
{
message: 'It looks like you have been editing something. '
+ 'If you leave before saving, your changes will be lost.'
}
);
});
</script>
Benutzerdefinierte Nachrichten werden nicht überall unterstützt
Beachten Sie, dass Firefox 4 in diesem Dialogfeld keine benutzerdefinierten Nachrichten unterstützt. Ab April 2016 wird Chrome 51 eingeführt, in dem auch benutzerdefinierte Nachrichten entfernt werden .
Einige Alternativen gibt es an anderer Stelle auf dieser Website, aber ich denke, ein Dialog wie dieser ist klar genug:
Möchten Sie diese Seite verlassen?
Von Ihnen vorgenommene Änderungen werden möglicherweise nicht gespeichert.
Leave Stay