【问题标题】:how to detect form feild change live to show or hide submit button如何实时检测表单字段更改以显示或隐藏提交按钮
【发布时间】:2013-04-18 22:39:08
【问题描述】:

我的表格如下所示:

<form id="myform">
    <fieldset>
        <div class="row-fluid">
            <label class="checkbox"><input type="checkbox" id="status" name="status">Active</label>
        </div>
        <div class="row-fluid">
            <label>Address</label>
            <input type="text" id="city" name="city" />
            <input type="text" id="state" name="state" />
        </div>
        <a id="save" class="btn btn-primary hide">save changes</a>
        <a id="close" class="btn">Close</a>
    </fieldset>
</form>

我的这个表单显示为预填充。那就是我的状态被检查了,name 的值为 Anyname,city 的值为 Anycity,State 的值为 AnyState。基本上,当表单出现时,保存更改表单是隐藏的。但是,如果用户单击任何字段,只需附加任何字符或删除字符,它应该会实时检测更改,任何立即设置的保存更改按钮显示,即删除类隐藏。如果再次删除附加字符并将其设置为原始字符,则应再次隐藏保存更改按钮。

基本上是实时检测表单字段变化并实时隐藏或显示按钮。

我看过几个与之相关的问题,但没有一个符合我的要求。

我试过了

 $('myform:input, myform:checkbox').change(function() {
      $("#save").removeClass("hide");
});

【问题讨论】:

  • 你应该提到你正在使用 BackBone.js,因为你需要的可能很容易使用库中的功能来实现。

标签: javascript jquery forms


【解决方案1】:

您指的是 ID 为 accept 的元素,但它在您的 HTML 中不存在。

您的保存按钮的 ID 为 save

这是一个 jsfiddle,它在值更改时显示按钮:http://jsfiddle.net/Town/tUAeh/

为了在字段返回到之前的值时隐藏按钮,您需要存储初始值并将其与当前值进行比较,以确定是否实际发生了更改。

还值得注意的是,change 事件仅在失去焦点时在文本框上触发。我不确定这是否对您有问题,但您最好使用keyup

【讨论】:

  • 在你的jsFiddle中,你在'input'和'checkbox'上监听change(),但是checkbox不是一个元素,它也是一个输入元素;)
  • 您的代码几乎可以正常工作。但是,我有一些预先填充的值。也就是说,地址最初具有一定的价值。示例州:纽约。现在,如果我只是制作 newyorks,jst 附加一个 s,它应该在我添加“newyorkss”两个 ss 之前立即显示保存 cahnges 按钮。如果我再次回到纽约,它应该再次隐藏按钮。
  • @Lasang 你如何输入预填充的值?是不是像&lt;input type="text" value="newyork" /&gt;
  • @Lasang:你所描述的是我在答案末尾提到的 - change 事件仅在失去焦点时触发,而不是在每个字符发生变化时触发。为此,您需要keyup。为了将当前值与原始值进行比较,您需要更多代码(我在答案中也提到过)。
  • @Billy Mathews ,实际上我的表单是模板,我用一些主干模型填充它们。所以,我试图让它像 twitter profile tab edit 一样。如果表单从模型中获取价值。所以,如果我点击其中任何一个并尝试编辑,我会尝试立即检测并显示按钮以保存。同样,如果反斜杠或无论如何使值变为原始值,它应该再次隐藏显示的保存按钮。
【解决方案2】:

首先您必须保存当前值,然后在发生任何更改时进行比较。我使用 .data 来存储原始数据。

编辑:从原始代码中删除了一些调试/显示操作代码。

// save original values
$(':input').each(function () {
    var setvalue = getCurrentValue($(this));
    $(this).data('originalvalue', setvalue);
});
// check them if anything changes
$(':input').change(function () {
    if (checkvalues()) {
        $("#save").addClass("hide");
    } else {
        $("#save").removeClass("hide");
    }
});
//return current value for checking/setting
function getCurrentValue(checkMe) {
    var currentValue = '';
    if (checkMe.is(':checkbox')) {
        currentValue = checkMe.prop('checked');
    } else {
        currentValue = checkMe.val();
    }
    return currentValue;
}
// if any do not match original, return false
function checkvalues() {
    var original = true;
    $(':input').each(function () {
        var currentValue = getCurrentValue($(this));
        var originalValue = $(this).data('originalvalue');
        if (currentValue !== originalValue) {
            original = false;
        }
    });
    return original;
}

编辑:上面的更紧凑的版本:

$(':input').each(function () {
    $(this).data('originalvalue', getCurrentValue($(this)));
});
$('#myform').on('change', ':input', function () {
    if (checkvalues()) {
        $("#save").addClass("hide");
    } else {
        $("#save").removeClass("hide");
    }
});

function getCurrentValue(checkMe) {
    return checkMe.is(':checkbox') ? checkMe.prop('checked') : checkMe.val();
}

function checkvalues() {
    var original = true;
    $(':input').each(function () {
        if (getCurrentValue($(this)) !== $(this).data('originalvalue')) {
            original = false;
        }
    });
    return original;
}

使用中的紧凑版本示例:http://jsfiddle.net/gRXDN/

【讨论】:

    【解决方案3】:

    看看this working jsFiddle

    $('input', '#myform').keyup(function() {
         if ( $(this).val() !=  $(this).attr('value') ){
              $("#save").removeClass("hide");
         }else{
             donthide = false;
             $('input', '#myform').each(function(){
                 console.log($(this).val() + ' ?= ' + $(this).attr('value'));
                 if ( $(this).val() != $(this).attr('value') ){
                     donthide = true;
                 }
             });
             console.log(donthide);
             if (!donthide) $('#save').addClass('hide');
         }
    });
    

    这仅在所有字段都具有“值”属性时才有效,但您可以更改它以补偿缺失值。

    【讨论】:

      【解决方案4】:

      由于您需要将原始值与当前值进行比较,因此您必须将原始值存储在某个地方。

      正如 CBroe 在 cmets 中指出的,您可以使用 defaultValuedefaultChecked 获取每个元素的原始值:

      以下检查每个输入以查看值是否已更改,并返回已更改的元素的length(数量)。然后您可以使用它来显示/隐藏保存按钮。

      var $inputs = $('#myform :input');
      $inputs.on('keyup change', function() {
      
        var dataChanged = $inputs.filter(function() {
          if ($(this).is(':checkbox')) {
            var originalValue = this.defaultChecked;
            var currentValue = this.checked;
          } else {
            var originalValue = this.defaultValue;
            var currentValue = this.value;
          }
          return originalValue != currentValue;
        }).length;    
      
        if (dataChanged == 0) {
          $('#save').addClass('hide') 
        } else { 
          $('#save').removeClass('hide');
        }
      
      });
      

      注意我是如何附加keyup() 事件以及change() 事件的。这将在按下某个键时触发文本输入功能,并立即隐藏或显示保存按钮。

      Here's a fiddle

      【讨论】:

      • 几点小问题: 1. 使用var 关键字初始化变量,这样您就不会用不必要的全局变量污染全局范围。 2、originalValue作为变量名没有意义;这不是原始值,而是当前值。 3.如果是复选框,可以使用this.checked获取输入的当前选中状态,不需要使用$this.prop('checked')(节省一些函数调用)。
      • 这并没有完全消除 - 如果您将其中一个值更改回原来的值,那么即使其他值已更改,“保存”按钮也会被删除。听起来应该是直截了当的,因为值已经有一个 BackBone 模型 - 我从未使用过 BB,但我猜脏检查将包括在内。
      • 是的,它在 js fiddle 中确实有效。但是,当我将它包含在主干视图中时,它不起作用。我想这是本地的。我也有这个供查看。
      • 我检查了 $('#myform :input').on('keyup change', function() { alert(1); }); ,它可以很好地提醒价值变化
      • “你必须将原始值存储在某个地方”——它们已经存在,在每个表单元素拥有的 defaultValue 属性中(对应于复选框 defaultChecked /单选按钮)。
      【解决方案5】:

      试试这个

      $('input[type=text] input[type=checkbox]').change(function(){
          $('#save').removeClass('hide'); 
      });
      

      在表单中没有“接受”id。确保你删除类以接受 id。

      【讨论】:

        【解决方案6】:

        它给你一个错误吗?因为它应该这样做,因为您在#accept 之后缺少引号。 而且我觉得你的选择器很奇怪,试试

        $('#myform input[type=text], #myform [type=checkbox]').change();
        

        由于没有状态为 :input 的名为 myform 的元素

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-09-22
          • 1970-01-01
          • 1970-01-01
          • 2016-03-13
          • 1970-01-01
          • 2011-11-25
          • 1970-01-01
          相关资源
          最近更新 更多