Woher weiß ich, dass sich eine Formulareingabe geändert hat?
Lesezeit: 4 Minuten
Ich habe ein Formular generiert von <% Ajax.BeginForm() {} %> die viele Eingaben und Texareas enthält.
Wenn sich ein Eingabewert ändert, muss ich davon wissen und die Eingabe und das Formular als “dirty” markieren. Wenn der Benutzer versucht, die Seite ohne Speichern zu verlassen, werde ich ihn oder sie bitten, das Abbrechen der Änderungen zu bestätigen.
Irgendwelche Vorschläge, wie das gemacht werden sollte?
Tom Brüder
Die HTML-Steuerelemente enthalten eine Eigenschaft, die den ursprünglichen Wert enthält. Sie können diesen Wert mit dem aktuellen Wert vergleichen, um festzustellen, ob es Änderungen gegeben hat.
function getHasChanges() {
var hasChanges = false;
$(":input:not(:button):not([type=hidden])").each(function () {
if ((this.type == "text" || this.type == "textarea" || this.type == "hidden") && this.defaultValue != this.value) {
hasChanges = true;
return false; }
else {
if ((this.type == "radio" || this.type == "checkbox") && this.defaultChecked != this.checked) {
hasChanges = true;
return false; }
else {
if ((this.type == "select-one" || this.type == "select-multiple")) {
for (var x = 0; x < this.length; x++) {
if (this.options[x].selected != this.options[x].defaultSelected) {
hasChanges = true;
return false;
}
}
}
}
}
});
return hasChanges;
}
function acceptChanges() {
$(":input:not(:button):not([type=hidden])").each(function () {
if (this.type == "text" || this.type == "textarea" || this.type == "hidden") {
this.defaultValue = this.value;
}
if (this.type == "radio" || this.type == "checkbox") {
this.defaultChecked = this.checked;
}
if (this.type == "select-one" || this.type == "select-multiple") {
for (var x = 0; x < this.length; x++) {
this.options[x].defaultSelected = this.options[x].selected
}
}
});
}
Ich mag diese Art zu prüfen, ob der Wert gleich dem Standardwert ist, und ich denke, das würde in einer “traditionellen Form” gut funktionieren. Ich werde die Änderungen jedoch über eine XMLHttpRequest übermitteln und muss das Formular “zurücksetzen”, wenn die Übermittlung erfolgreich war. Gibt es einen netten Weg, wie ich kann einstellen den defaultValue/defaultChecked etc. auf den aktuellen Wert?
– tkalve
30. Dezember 2010 um 13:53 Uhr
Vielen Dank. Ich habe noch einige Änderungen vorgenommen, indem ich das Zahlenfeld hinzugefügt habe. 🙂
– Tadit Dash
25. Februar 2016 um 11:39 Uhr
Daumen hoch für die Beschleunigung und die Verwendung von “this” anstelle von “$(this)”, um den reinen Javascript-“Typ” zu erhalten.
– Löwe
14. September 2017 um 15:07 Uhr
Diese alte Frage wiederbeleben, weil ich an einen einfacheren/besseren Weg gedacht habe. Anstatt auf Ereignisse an den verschiedenen Eingaben zu hören, können Sie die ursprünglichen Formulardaten serialisieren, speichern und später erneut serialisieren und prüfen, ob sie sich geändert haben, wie folgt:
var originalFormData = $('form#formId').serialize();
function checkFormChanged() {
if(originalFormData !== $('form#formId').serialize()) {
//it's dirty!
}
}
Ein zusätzlicher Vorteil hier ist, dass wenn der Benutzer eine Änderung vornimmt und dann kehrt zurück it, wird diese Prüfung das Formular als sauber melden.
Dies ist zweifellos die beste Antwort
– Flügelschlag
10. März 2020 um 15:47 Uhr
Eine gute Lösung, hat aber bei Formularen mit Eingabetyp = Datei nicht funktioniert
– Akshit Arora
9. Oktober 2020 um 6:41 Uhr
Damiqib
Aus jQuery-Dokumenten:
//This applies to whole form
$('#formID').change(function() {
alert('Form changed!');
});
Und Sie könnten dies tun, um nur die Eingaben zu überprüfen und den Benutzer zu benachrichtigen, wenn er versucht, ohne Änderungen zu beenden.
var inputsChanged = false;
$('#formID input').change(function() {
inputsChanged = true;
});
$(window).unload(function() {
if (inputsChanged === true) {
alert('Would you like to save your edits before exiting?');
}
});
Überprüfen Sie dann vor dem POSTing, ob es eine unsaubere Eingabe gibt. Sie können sogar etwas Farbe hinzufügen, indem Sie die schmutzige CSS-Klasse verwenden.
EDIT: Tippfehler behoben ‘geändert’ zu ‘ändern’
Santhosh S
Sie könnten das jquery-Plugin Dirrty verwenden, um das Formular Dirty zu identifizieren.
Setzen Sie im Ereignis on(“dirty”) eine globale Variable auf true, um zu erkennen, dass sich das Formular geändert hat.
Handhaben window.onbeforeunload oder $(window).unload() Ereignis und erhalten Sie eine Bestätigung vom Benutzer basierend auf diesem Variablenwert.
Der Vorteil dieses Plugins ist, dass Sie mit dem ‘on(“clean”)-Event zurückverfolgen können, ob das Formular wieder auf die ursprünglichen Werte geändert wird
10661900cookie-checkWoher weiß ich, dass sich eine Formulareingabe geändert hat?yes