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