Ich habe einige Seiten mit Formularen in meiner Bewerbung.
Wie kann ich das Formular so sichern, dass jemand, der weg navigiert oder den Browser-Tab schließt, aufgefordert werden sollte, zu bestätigen, dass er das Formular wirklich mit nicht gespeicherten Daten verlassen möchte?
javascript
forms
Khan
quelle
quelle
Antworten:
Kurze, falsche Antwort:
Sie können dies tun, indem Sie das
beforeunload
Ereignis behandeln und eine Nicht-Null-Zeichenfolge zurückgeben :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:
Rufen Sie dann den Setter an, wenn Sie senden:
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.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'sserialize()
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:
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 alleinput
s (undtextarea
s undselect
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:
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:
quelle
Überprüfen Sie das JavaScript- Ereignis onbeforeunload . Es handelt sich um nicht standardmäßiges JavaScript, das von Microsoft eingeführt wurde. Es funktioniert jedoch in den meisten Browsern und die Dokumentation vor dem Herunterladen enthält weitere Informationen und Beispiele.
quelle
über jquery
Sie können die Google JQuery Form Serialize-Funktion verwenden. Dadurch werden alle Formulareingaben erfasst und im Array gespeichert. Ich denke diese Erklärung ist genug :)
quelle
Universelle Lösung, die keine Konfiguration erfordert, die automatisch alle Eingabemodifikationen erkennt, einschließlich inhaltsbearbeitbarer Elemente:
quelle
Aufbauend auf der hervorragenden Idee von Wasim A. , Serialisierung zu verwenden. Das Problem dort war, dass die Warnung auch angezeigt wurde, als das Formular gesendet wurde. Dies wurde hier behoben.
Es wurde in Chrome und IE 11 getestet.
quelle
Basierend auf den vorherigen Antworten und zusammengeschustert von verschiedenen Stellen im Stapelüberlauf, ist hier die Lösung, die ich gefunden habe und die den Fall behandelt, wenn Sie Ihre Änderungen tatsächlich einreichen möchten:
Es ist erwähnenswert, dass IE11 anscheinend erfordert, dass die
closeEditorWarning
Funktion zurückkehrt,undefined
damit keine Warnung angezeigt wird .quelle
QC.thisPage.isDirty = false;
seinwindow.thisPage.isDirty = false;
? Auf diese Weise wird überprüft, ob Sie das Formular senden und keine Warnung anzeigen. Schien für meine Tests zu arbeiten. Außerdem haben die meisten Formeninput
eher ein als eintextarea
. Ich habe folgendes verwendet, was ziemlich gut funktioniert:$("form").on('keyup', 'textarea,input,select', function () {
Der folgende Einzeiler hat für mich gearbeitet.
Setzen Sie einfach je nach Status Ihrer Anwendung
modified
auf true oder false .quelle
undefined
anstatt dass dernull
IE "null" ausgibt, wenn siemodified
falsch ist.Der folgende Code funktioniert hervorragend. Sie müssen die Eingabeänderungen Ihrer Formularelemente über das ID-Attribut erreichen:
quelle
quelle
Mit serialize () können Sie eine URL-codierte Textzeichenfolge erstellen, indem Sie Formularwerte serialisieren und prüfen, ob sich das Formular vor dem Entladen geändert hat
Siehe diesen Link https://coderwall.com/p/gny70a/alert-when-leaving-page-with-unsaved-form Geschrieben von Vladimir Sidorenko
quelle
serialize()
, und tatsächlich hat es seine Nachteile.Wenn Sie der Idee von @codecaster hinzufügen, können Sie dies jeder Seite mit einem Formular hinzufügen (in meinem Fall verwende ich es global, sodass nur auf Formularen diese Warnung angezeigt wird) und seine Funktion in ändern
Setzen Sie auch Formulare ein, einschließlich Login und Links zu Abbrechen-Schaltflächen. Wenn eine Person auf Abbrechen drückt oder das Formular sendet, wird die Warnung nicht auch auf jeder Seite mit einem Formular ausgelöst ...
quelle
Eine ausführliche Erklärung finden Sie hier: http://techinvestigations.redexp.in/comparison-of-form-values-on-load-and-before-close/ Vergleich der Formularwerte beim Laden und -vor-schließen
Der Hauptcode:
quelle
Kurze Antwort:
quelle
Die Lösung von Eerik Sven Puudist ...
... hat die Arbeit für mich spontan in einem komplexen objektorientierten Umfeld erledigt, ohne dass Änderungen erforderlich waren.
Die einzige Änderung, die ich vorgenommen habe, war die Bezugnahme auf das konkrete Formular (nur ein Formular pro Datei) mit dem Namen "formForm" ('form' -> '#formForm'):
Besonders gut gelungen ist die Tatsache, dass der Submit-Button "in Ruhe gelassen" wird.
Außerdem funktioniert es bei mir auch mit der neuesten Version von Firefox (Stand 7. Februar 2019).
quelle
Die universelle Lösung von Eli Grey wurde erst getestet, nachdem ich den Code vereinfacht hatte
Die Änderungen an seiner werden gelöscht
target[defaultValue]
und nurtarget.dataset[defaultValue]
zum Speichern des tatsächlichen Standardwerts verwendet.Und ich habe einen 'gespeicherten' Ereignis-Listener hinzugefügt, in dem das 'gespeicherte' Ereignis von Ihnen selbst ausgelöst wird, wenn Ihre Speicheraktion erfolgreich war.
Diese "universelle" Lösung funktioniert jedoch nur in Browsern, nicht in der Webansicht der App, z. B. in Wechat-Browsern.
Damit es (teilweise) auch in Wechat-Browsern funktioniert, gibt es noch eine weitere Verbesserung:
quelle
Ich habe es anders gemacht und hier geteilt, damit jemand Hilfe bekommen kann, die nur mit Chrome getestet wurde.
Ich wollte den Benutzer vor dem Schließen der Registerkarte nur warnen, wenn es einige Änderungen gibt.
Funktioniert gut, hat aber ein anderes Problem. Als ich das Formular abschicke, erhalte ich die unerwünschte Warnung. Ich habe viele Problemumgehungen gesehen. Dies liegt daran, dass beim Laden vor dem Laden vor dem Senden ein Brand ausgelöst
onbeforeunload = null
wird Onclick-Ereignis der Senden-Schaltfläche wird vor diesen beiden Ereignissen ausgelöst, daher habe ich den Code aktualisiertquelle
Erstens haben die meisten Browser diese Funktion standardmäßig. Und warum brauchst du das überhaupt? Warum nicht das Formular synchron halten? Ich meine, speichern Sie es bei jeder Änderung, ohne auf die Übermittlung durch den Benutzer zu warten. Wie bei Google-Kontakten. Natürlich, wenn nur alle Felder in der Form obligatorisch sind. Benutzer mögen es nicht, wenn sie zwingen, etwas zu füllen, ohne die Möglichkeit zu haben, wegzugehen, um zu überlegen, ob sie es brauchen. :) :)
quelle
save it on any change without waiting any submitting from user
Sie wollen das nicht immer tun. Manchmal möchte der Benutzer viele Änderungen vornehmen und dann überprüfen und bestätigen, dass er sie speichern möchte.