我有一个由<% Ajax.BeginForm() {} %>
生成的表单,其中包含大量输入和texareas。
当输入值改变时,我需要知道它并将输入和表格标记为“脏”。如果用户试图不保存而离开页面,我会要求他或她确认放弃更改。
有关如何做到这一点的任何建议吗?
答案 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?');
}
});
答案 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”)事件将表单再次更改为原始值