如果表单字段未被修改,如何禁用jQuery中的提交按钮?

如果表单字段未被修改,如何禁用jQuery中的提交按钮?,jquery,html,forms,form-submit,Jquery,Html,Forms,Form Submit,我有一个包含文本字段、复选框、单选按钮和提交按钮的HTML表单 var isDirty = false; function SomethingChanged(){ if( !isDirty ) isDirty = true; btnSubmit.disabled = !isDirty; } 我希望只有当字段的内容被修改时,提交按钮才被启用。现在需要注意的是:如果用户将字段内容修改回原始值,那么表单按钮应该再次被禁用 原始字段值“foo”=>提交按钮被禁用 用户将字段值更改

我有一个包含文本字段、复选框、单选按钮和提交按钮的HTML表单

var isDirty = false;

function SomethingChanged(){
     if( !isDirty ) isDirty = true;
     btnSubmit.disabled = !isDirty;
}
我希望只有当字段的内容被修改时,提交按钮才被启用。现在需要注意的是:如果用户将字段内容修改回原始值,那么表单按钮应该再次被禁用

  • 原始字段值“foo”=>提交按钮被禁用
  • 用户将字段值更改为“栏”=>提交按钮变为启用状态
  • 用户将字段值更改回“foo”=>再次禁用提交按钮
  • 如何实现这一点?是否有任何一种通用的解决方案或脚本,我可以使用任何形式


    编辑:我所要求的不能用简单的脏状态跟踪来完成。

    使用脏状态跟踪。将布尔值(例如IsDirty)附加到每个输入控件,并在值更改时进行切换。提交表单时,检查是否至少有一个或多个值已更改,然后提交表单。否则,将向用户显示警报

    另一种解决方案是在控件值更改时调用公共函数。在该函数中,如果发生更改,可以将全局变量(IsDirty)设置为true,还可以启用/禁用submit按钮

    var isDirty = false;
    
    function SomethingChanged(){
         if( !isDirty ) isDirty = true;
         btnSubmit.disabled = !isDirty;
    }
    
    任何控件的通用函数

    假设:将每个控件的初始值添加到属性“InitVal”

    在上面的函数中,为了使其通用,您可以为每种类型的控件(如TextBoxChanged和DropDownChanged等)使用单独的函数,但每个控件上都有以下两个属性

  • InitValue—控件的初始值
  • IsDirty—表示控件值已更改的布尔值
  • 请看一下。

    只需两个步骤:

  • 将所有初始值的散列存储在javascript变量中
  • 每次输入的更改都会重新计算该散列,并使用存储的散列进行验证。如果相同,则禁用提交按钮,如果不相同,则启用它

  • 这似乎是一个更好的答案


    我没有测试下面的内容:-),但这就是你的意思吗

    $(document).ready(function() {
        $("#myform :input").attr("init",$(this).val()).bind("change.dirty", function(evt) {
            if ($(this).val()!=$(this).attr("init")) $(this).addClass("dirty");
            else $(this).removeClass("dirty");
            $('#thebutton').attr("disabled",!$("#myform .dirty").size());
        });
    });
    

    *-pike

    应该可以保存整个表单对象(或者按原样保存,或者使用.each()迭代并将数据存储在映射中),然后在提交时执行相同的操作并比较两个值。

    您可以改为使用plugin并将indicateDirtyForm:true设置为。现在,如果您的表单有“dirtyForm”类,则表示您有未保存的更改。

    您可以设置一个jquery脚本,在页面加载时扫描页面并检查表单,清点字段及其值,然后在更新输入时对照输入引用数组进行检查。

    如果用户将值更改回原始值,则这将不起作用,这种方法仍将设置脏位,在这种情况下,我需要禁用按钮。