45 lines
1.7 KiB
JavaScript
45 lines
1.7 KiB
JavaScript
// Warnt, bevor ungespeicherte Änderungen verloren gehen.
|
|
//
|
|
// Gilt für Formulare mit dem Attribut data-ungespeichert (das
|
|
// Bearbeitungsformular eines Eintrags). Hat jemand dort etwas geändert und
|
|
// verlässt die Seite, ohne zu speichern — ein Klick in der Seitenleiste, Tab
|
|
// schließen, zurück —, fragt der Browser nach. Den Text der Rückfrage legt der
|
|
// Browser selbst fest; eigene Texte erlauben moderne Browser nicht mehr.
|
|
//
|
|
// Als "geändert" gilt nur, was sich wirklich vom Ausgangsstand unterscheidet:
|
|
// Wer etwas tippt und wieder löscht, wird nicht gefragt. Abgeschickt wird
|
|
// ohne Rückfrage, und "Abbrechen" ist eine bewusste Entscheidung, die
|
|
// trotzdem nachfragt — sie ist nur ein Link.
|
|
(function () {
|
|
"use strict";
|
|
|
|
// stand fasst alle Felder eines Formulars zu einer Zeichenkette zusammen.
|
|
function stand(form) {
|
|
var teile = [];
|
|
new FormData(form).forEach(function (wert, name) {
|
|
if (name !== "csrf_token") {
|
|
teile.push(name + "=" + wert);
|
|
}
|
|
});
|
|
return teile.join("\u0000");
|
|
}
|
|
|
|
document.querySelectorAll("form[data-ungespeichert]").forEach(function (form) {
|
|
var ausgang = stand(form);
|
|
var wirdGespeichert = false;
|
|
|
|
form.addEventListener("submit", function () {
|
|
wirdGespeichert = true;
|
|
});
|
|
|
|
window.addEventListener("beforeunload", function (event) {
|
|
if (wirdGespeichert || stand(form) === ausgang) {
|
|
return;
|
|
}
|
|
// Beides nötig: preventDefault für aktuelle Browser, returnValue
|
|
// für ältere.
|
|
event.preventDefault();
|
|
event.returnValue = "";
|
|
});
|
|
});
|
|
})();
|