【问题标题】:val() doesn't trigger change() in jQueryval() 不会在 jQuery 中触发 change()
【发布时间】:2011-03-11 21:34:31
【问题描述】:

当我使用按钮更改其值时,我试图在文本框上触发 change 事件,但它不起作用。检查this fiddle

如果您在文本框中输入内容并单击其他位置,则会触发change。但是,如果单击该按钮,文本框的值会更改,但不会触发 change。为什么?

【问题讨论】:

  • 标题本身回答了我的问题。在 .change() 确认黄色“注意:使用 JavaScript 更改输入元素的值,例如使用 .val(),不会触发事件。”
  • 希望我能早点遇到stackoverflow.com/questions/11873721/…,希望对您有所帮助。
  • 这个问题必须重新打开为受欢迎,我们应该将不太受欢迎的question标记为重复

标签: jquery triggers


【解决方案1】:

onchange 仅在用户输入输入然后输入失去焦点时触发。

您可以在设置值后手动调用onchange事件:

$("#mytext").val( 777 ).change(); // someObject.onchange(); in standard JS

或者,您可以使用trigger 事件:

$("#mytext").val( 777 ).trigger("change");

【讨论】:

  • 随意扩展 jquery 并添加一个 say valWithChange 函数,它会做你想要的。它不能是默认操作,因为您不希望事件从自动值更改触发,只有当用户与元素交互时
  • 我希望看到这个答案被编辑以解决将.change()链接到.val()方法的选项。
  • 原因可能是有些人在.change()中调用.val(),因为他们做输入验证。在.val() 上触发.change() 会导致无限循环。
  • 仅当他们将值更改为无法通过自己验证的值时,这将是愚蠢的。
  • 我最终绑定到blur 以完成类似的事情:$('#mytext').focus().val('New text').blur();
【解决方案2】:

我知道这是一个旧线程,但对于其他人来说,上述解决方案可能不如以下解决方案,而不是检查 change 事件,而是检查 input 事件。

$("#myInput").on("input", function() {
    // Print entered value in a div box
    $("#result").text($(this).val());
});

【讨论】:

    【解决方案3】:

    截至 2019 年 2 月,.addEventListener() 目前不适用于 jQuery .trigger().change(),您可以在下面使用 Chrome 或 Firefox 进行测试。

    txt.addEventListener('input', function() {
      console.log('not called?');
    })
    $('#txt').val('test').trigger('input');
    $('#txt').trigger('input');
    $('#txt').change();
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <input type="text" id="txt">

    您必须改用.dispatchEvent()

    txt.addEventListener('input', function() {
      console.log('it works!');
    })
    $('#txt').val('yes')
    txt.dispatchEvent(new Event('input'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    
    <input type="text" id="txt">

    【讨论】:

      【解决方案4】:

      根据 redsquare 的优秀建议,这很好用:

      $.fn.changeVal = function (v) {
          return this.val(v).trigger("change");
      }
      
      $("#my-input").changeVal("Tyrannosaurus Rex");
      

      【讨论】:

        【解决方案5】:

        你需要像这样链接方法:

        $('#input').val('test').change();
        

        【讨论】:

          【解决方案6】:

          您可以通过将 val 函数替换为原始 val 函数的代理来轻松覆盖 val 函数以触发更改。

          只需在文档中的某处添加此代码(加载 jQuery 后)

          (function($){
              var originalVal = $.fn.val;
              $.fn.val = function(){
                  var result =originalVal.apply(this,arguments);
                  if(arguments.length>0)
                      $(this).change(); // OR with custom event $(this).trigger('value-changed');
                  return result;
              };
          })(jQuery);
          

          一个工作示例:here

          (请注意,当调用 val(new_val) 时,即使值实际上没有更改,这将始终触发 change。)

          如果您只想在值实际更改时触发更改,请使用这个:

          //This will trigger "change" event when "val(new_val)" called 
          //with value different than the current one
          (function($){
              var originalVal = $.fn.val;
              $.fn.val = function(){
                  var prev;
                  if(arguments.length>0){
                      prev = originalVal.apply(this,[]);
                  }
                  var result =originalVal.apply(this,arguments);
                  if(arguments.length>0 && prev!=originalVal.apply(this,[]))
                      $(this).change();  // OR with custom event $(this).trigger('value-changed')
                  return result;
              };
          })(jQuery);
          

          活生生的例子:http://jsfiddle.net/5fSmx/1/

          【讨论】:

          • 嗯,我认为是不必要的打鸭补丁:-p。可能更好,如commented by redsquare,给这样的函数一个不同于.val()的名称。
          • 但是,所有在脑海中正确定义.val()的代码都会突然开始产生副作用:-p。
          • 这也会导致插件出现故障,可能不容易修复
          • 为了避免副作用,我修改了上面的 val 函数,但是我触发了一个不同的事件(“val”),这让我可以保留现有代码,但随时可以轻松处理它需要:$(...).on('change val', ...)
          • 如果您无法控制调用.val() 的代码(例如使用外部库),这是一个很好的解决方案。而且如果你触发一个自定义事件,它不会造成任何伤害。
          【解决方案7】:

          来自https://api.jquery.com/change/

          change 事件在其值更改时发送到元素。此事件仅限于&lt;input&gt; 元素、&lt;textarea&gt; 框和&lt;select&gt; 元素。对于选择框、复选框和单选按钮,当用户使用鼠标进行选择时会立即触发该事件,但对于其他元素类型,该事件会延迟到元素失去焦点为止。

          【讨论】:

            【解决方案8】:

            看起来事件没有冒泡。试试这个:

            $("#mybutton").click(function(){
              var oldval=$("#mytext").val();
              $("#mytext").val('Changed by button');
              var newval=$("#mytext").val();
              if (newval != oldval) {
                $("#mytext").trigger('change');
              }
            });
            

            我希望这会有所帮助。

            我只尝试了一个普通的旧 $("#mytext").trigger('change') 而不保存旧值,即使值没有改变,.change 也会触发。这就是为什么我保存以前的值并仅在它发生更改时才调用$("#mytext").trigger('change')

            【讨论】:

            • 很惊讶这没有更多的投票,因为它是 HTML 元素更改的当前有效实现。
            【解决方案9】:

            不,您可能需要在设置值后手动触发它:

            $('#mytext').change();
            

            或:

            $('#mytext').trigger('change');
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-08-16
              • 1970-01-01
              • 2010-11-17
              • 1970-01-01
              相关资源
              最近更新 更多