【问题标题】:Can jQuery check whether input content has changed?jQuery可以检查输入内容是否发生了变化?
【发布时间】:2011-09-23 21:09:19
【问题描述】:

是否可以将 javascript(最好是 jQuery)事件绑定到以某种方式“更改”表单输入值?

我知道.change() 方法,但在您(光标)离开输入字段之前它不会触发。我也考虑过使用.keyup() 方法,但它也会对箭头键等做出反应。

我只需要每次触发一个动作,输入中的文本发生变化,即使只是一个字母变化。

【问题讨论】:

  • 如何使用按键事件?
  • 除了使用键之外,还有其他可能更改输入。例如,从先前插入的值的下拉菜单中进行选择。

标签: javascript jquery input onchange


【解决方案1】:

有一个简单的解决方案,就是 HTML5 input 事件。所有主要浏览器的当前版本都支持 <input type="text"> 元素,并且对于 IE

示例(IE

$("#your_id").on("input", function() {
    alert("Change to " + this.value);
});

【讨论】:

  • 谢谢,这正是我想要的。像魅力一样工作。
  • @vsync:我不清楚你的意思。没有处理input 事件的快捷方法,但jQuery 仍然使用on() 为该事件添加一个监听器。证明:jsfiddle.net/QA5hN
  • 这个事件不仅适用于<input type="text">,也适用于<textarea><select>,因为我测试过(在chrome上)。
  • 请记住,这不会检测到 javacript 中所做的输入更改
【解决方案2】:

是的,将其与更改前的值进行比较。

var previousValue = $("#elm").val();
$("#elm").keyup(function(e) {
    var currentValue = $(this).val();
    if(currentValue != previousValue) {
         previousValue = currentValue;
         alert("Value changed!");
    }
});

另一种选择是仅在某些键上触发您更改的功能。使用e.KeyCode 找出按下的键。

【讨论】:

  • @Jordão 当然,我没有看到这个要求。
  • Jordão 是对的,用户可以选择以前输入的值之一。 Keyup 不是我要找的。此外,我的表单是动态生成的,很难存储所有值。没有任何“简单”的方法吗?
  • @Pavel 您应该阐明您希望它如何工作。什么时候需要触发事件?什么时候通过粘贴文本改变了?剪切文字?使用萤火虫编辑?只是用键盘改变?解决方案完全取决于您需要的灵活性。
  • @alexn 我只需要在(且仅当)输入中的文本值发生更改时触发该操作。我正在寻找简单的函数,比如 .onSimpleChange()...
  • 而且 .change() 不起作用,因为您希望它在更改后准确触发?没有模糊?
【解决方案3】:

您还可以将初始值存储在数据属性中,并根据当前值进行检查。

<input type="text" name="somename" id="id_someid" value="" data-initial="your initial value" /> 

$("#id_someid").keyup(function() {
    return $(this).val() == $(this).data().initial;
});

如果初始值没有改变,则返回 true。

【讨论】:

    【解决方案4】:
    function checkChange($this){
        var value = $this.val();      
        var sv=$this.data("stored");            
            if(value!=sv)
                $this.trigger("simpleChange");    
    }
    
    $(document).ready(function(){
        $(this).data("stored",$(this).val());   
            $("input").bind("keyup",function(e){  
            checkChange($(this));
        });        
        $("input").bind("simpleChange",function(e){
            alert("the value is chaneged");
        });        
    });
    

    这是小提琴http://jsfiddle.net/Q9PqT/1/

    【讨论】:

    • 这是在最终提交中监控已提交更改的好方法。
    【解决方案5】:

    您可以在 jQuery 中使用数据并捕获所有事件,然后根据它的最后一个值(未测试)对其进行测试:

    $(document).ready(function() {  
        $("#fieldId").bind("keyup keydown keypress change blur", function() {
            if ($(this).val() != jQuery.data(this, "lastvalue") {
             alert("changed");
            }
            jQuery.data(this, "lastvalue", $(this).val());
        });
    });
    

    这对于一长串项目也很有效。使用jQuery.data 意味着您不必创建javascript 变量来跟踪值。您可以通过$("#fieldId1, #fieldId2, #fieldId3, #fieldId14, etc") 跟踪许多字段。

    更新:将blur 添加到bind 列表中。

    【讨论】:

    • 谢谢,这很好用。但是,仍然存在一个问题:当用户从已输入的值(下拉浏览器提示)中选择值时,不会执行该操作。但是,即使您不留下输入,它也应该这样做。
    • 哇。我同意它绝对应该在那里注册一个事件。如果浏览器不合作,那么我能看到的唯一办法是是否将“模糊”事件添加到列表中。当用户离开该字段时,这将捕获更改。
    • 我建议在需要精确跟踪输入内容的情况下,使用 autocomplete="off" 属性禁用自动完成。
    【解决方案6】:

    我不得不将这种代码用于将内容粘贴到字段中的扫描仪

    $(document).ready(function() {
      var tId,oldVal;
      $("#fieldId").focus(function() {
         oldVal = $("#fieldId").val();
         tId=setInterval(function() { 
          var newVal = $("#fieldId").val(); 
          if (oldVal!=newVal) oldVal=newVal;
          someaction() },100);
      });
      $("#fieldId").blur(function(){ clearInterval(tId)});
    });
    

    未测试...

    【讨论】:

      【解决方案7】:

      我认为没有“简单”的解决方案。您可能需要同时使用 onKeyUp 和 onChange 事件,以便您还可以捕捉到使用鼠标进行更改的时间。每次调用您的代码时,您都可以将您“看到”的值存储在附加到该字段的 this.seenValue 上。这应该会更容易一些。

      【讨论】:

      • 在用户离开现场之前是否触发了任何版本的“onChange”?他可以通过鼠标选择值并停留在该字段中。我需要触发事件。我如何识别这种情况?
      • 不,我不相信有。您还可以在 onmouseup 事件上调用您的代码。这应该涵盖所有基础。
      • 是的,有一个简单的方法:HTML5 input 事件。看我的回答。
      【解决方案8】:

      您可以在键和鼠标事件的组合上设置事件,当然也可以设置 onblur。在这种情况下,存储输入的值。在下一次调用中,将当前值与最后存储的值进行比较。只有在实际发生变化时才施展你的魔法。

      以或多或少干净的方式做到这一点:

      您可以将数据与 DOM 元素相关联(查找 api.jquery.com/jQuery.data),因此您可以编写一组通用的事件处理程序,分配给表单中的所有元素。每个事件都可以将触发它的元素传递给一个通用函数。该函数可以将旧值添加到元素的数据中。这样,您应该能够将其实现为适用于整个表单以及从现在开始编写的每个表单的通用代码。 :) 我猜它可能只需要大约 20 行代码。

      这个小提琴中有一个例子:http://jsfiddle.net/zeEwX/

      【讨论】:

      • 存储所有表单值并手动比较它们真的是唯一的方法吗?
      • 创建了一个小提琴来展示如何在没有全局变量的情况下做到这一点,但通过将旧值与元素本身一起存储。修改了我的答案。
      【解决方案9】:

      由于用户可以进入操作系统菜单并使用鼠标选择粘贴,因此没有安全事件会为您触发此操作。我发现始终有效的唯一方法是设置一个 setInterval 来检查输入值是否已更改:

      var inp = $('#input'),
          val = saved = inp.val(),
          tid = setInterval(function() {
              val = inp.val();
              if ( saved != val ) {
                  console.log('#input has changed');
                  saved = val;
          },50);
      

      您也可以使用 jQuery 特殊事件进行设置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 2013-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-29
        相关资源
        最近更新 更多