我如何知道表单输入已更改?

时间:2010-12-30 12:40:26

标签: jquery asp.net-mvc-2 asp.net-ajax

我有一个由<% Ajax.BeginForm() {} %>生成的表单,其中包含大量输入和texareas。

当输入值改变时,我需要知道它并将输入和表格标记为“脏”。如果用户试图不保存而离开页面,我会要求他或她确认放弃更改。

有关如何做到这一点的任何建议吗?

5 个答案:

答案 0 :(得分:24)

html控件包含一个保存原始值的属性。您可以将此值与当前值进行比较,以查看是否有任何更改。

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
            }
        }
    });
}

答案 1 :(得分:19)

来自jQuery Docs:

//This applies to whole form
$('#formID').change(function() {
  alert('Form changed!');
});

你可以这样做,只检查输入并通知用户,如果他们试图退出而不保存更改。

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()

答案 2 :(得分:16)

恢复这个老问题,因为我想到了一个更简单/更好的方法。您可以序列化初始表单数据,存储它,然后稍后再次序列化并检查它是否已更改,而不是监听各种输入上的事件,如下所示:

var originalFormData = $('form#formId').serialize();
function checkFormChanged() {
    if(originalFormData !== $('form#formId').serialize()) {
        //it's dirty!
    }
}

此处的另一个优点是,如果用户进行了更改,然后还原,则此检查会将表单报告为干净。

答案 3 :(得分:8)

我会用jQuery做到这一点。它会是这样的(只是草稿,你可能需要添加/更改一些代码):

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

然后,在POSTing之前,检查是否有脏输入。您甚至可以使用脏css类添加一些颜色。

编辑:错字修正'已更改'为'更改'

答案 4 :(得分:1)

您可以使用jquery插件Dirrty识别脏表单。

https://github.com/rubentd/dirrty

在on(“ dirty”)事件中,将某些全局变量设置为true,以标识表单已更改。

处理window.onbeforeunload$(window).unload()事件,并根据该变量值获得用户的确认。

此插件的优点是,您可以使用'on(“ clean”)事件将表单再次更改为原始值