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?

Benutzer-Avatar
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

Benutzer-Avatar
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?'); 
  }    
});

jQuery-API .change()

  • Das hat bei mir super funktioniert. Außerdem ist es viel einfacher und verwendet weniger Code als die akzeptierte Antwort.

    – robskrob

    13. Juni 2018 um 17:45 Uhr

Benutzer-Avatar
gehen

Ich würde das mit jQuery machen. Es wäre so etwas (nur ein Entwurf, Sie müssen möglicherweise Code hinzufügen/ändern):

$(document).ready(function() {  
    $('#formId:input').each(function(key) {
        $(this).change(function() {
            $(this).addClass('dirty');
        });
    });
});

Ü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’

Benutzer-Avatar
Santhosh S

Sie könnten das jquery-Plugin Dirrty verwenden, um das Formular Dirty zu identifizieren.

https://github.com/rubentd/dirrty

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

1066190cookie-checkWoher weiß ich, dass sich eine Formulareingabe geändert hat?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy