munin/static/ungespeichert.js

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 = "";
});
});
})();