tka*_*lve 18 jquery asp.net-ajax asp.net-mvc-2
我有一个生成的表单,<% Ajax.BeginForm() {} %>其中包含大量的输入和texareas.
当输入值改变时,我需要知道它并将输入和表单标记为"脏".如果用户试图不保存而离开页面,我会要求他或她确认放弃更改.
有关如何做到这一点的任何建议?
Tom*_*ers 26
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
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
Dam*_*qib 21
来自jQuery Docs:
//This applies to whole form
$('#formID').change(function() {
alert('Form changed!');
});
Run Code Online (Sandbox Code Playgroud)
你可以这样做,只检查输入并通知用户,如果他们试图退出而不保存更改.
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?');
}
});
Run Code Online (Sandbox Code Playgroud)
小智 17
恢复这个老问题,因为我想到了一个更简单/更好的方法.您可以序列化初始表单数据,存储它,然后稍后再次序列化并检查它是否已更改,而不是监听各种输入上的事件,如下所示:
var originalFormData = $('form#formId').serialize();
function checkFormChanged() {
if(originalFormData !== $('form#formId').serialize()) {
//it's dirty!
}
}
Run Code Online (Sandbox Code Playgroud)
这里的另一个优点是,如果用户进行了更改然后将其还原,则此检查会将表单报告为干净.
我会用jQuery做到这一点.它会是这样的(只是草稿,你可能需要添加/更改一些代码):
$(document).ready(function() {
$('#formId:input').each(function(key) {
$(this).change(function() {
$(this).addClass('dirty');
});
});
});
Run Code Online (Sandbox Code Playgroud)
然后,在POSTing之前,检查是否有脏输入.您甚至可以使用脏css类添加一些颜色.
编辑:拼写错误修改'已更改'为'更改'