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

Posted

技术标签:

【中文标题】我如何知道表单输入已更改?【英文标题】:How do I know that a form input has changed? 【发布时间】:2011-06-01 13:12:44 【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

【参考方案1】:

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

https://github.com/rubentd/dirrty

在 on("dirty") 事件中将一些全局变量设置为 true 以识别表单已更改。

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

这个插件的优点是你可以使用'on("clean") 事件再次将表单更改为原始值进行追踪

【讨论】:

【参考方案2】:

我会用 jQuery 来做这件事。大概是这样的(只是一个草稿,您可能需要添加/更改一些代码):

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

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

编辑:错字将“更改”固定为“更改”

【讨论】:

【参考方案3】:

来自 jQuery 文档:

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

【讨论】:

这对我很有用。此外,它比公认的答案更简单,使用的代码更少。【参考方案4】:

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

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

这里的另一个好处是,如果用户进行了更改然后还原它,此检查将报告表单是干净的。

【讨论】:

这无疑是最好的答案 一个很好的解决方案,但对输入 type=file 的表单对我不起作用【参考方案5】:

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

【讨论】:

我真的很喜欢这种检查值是否等于默认值的方式,我想这在“传统形式”中可以正常工作。但是,我将通过 XMLHttpRequest 提交更改,并且在提交成功后我需要“重置”表单。有没有一种好方法可以设置 defaultValue/defaultChecked 等为当前值? 谢谢。我通过添加数字字段进行了更多更改。 :) 为加快速度并使用“this”而不是“$(this)”来获得纯javascript“类型”而点赞。

以上是关于我如何知道表单输入已更改?的主要内容,如果未能解决你的问题,请参考以下文章

使用纯javascript检测更改的输入文本框[重复]

更改表单中的spring jsp日期输入绑定以使用freemarker

关注表单时如何更改表单中输入标签的颜色? [复制]

如何更改 SQL 插入语句的目标表?

使用 jQuery 检测表单输入的自动完成

如何将已输入的表单数据添加到表格行?