val()不会在jQuery中触发change()

Erg*_*gec 324 jquery triggers

change当我用按钮更改其值时,我试图在文本框上触发事件,但它不起作用.检查这个小提琴.

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

djd*_*d87 424

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

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

$("#mytext").change(); // someObject.onchange(); in standard JS
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用以下命令触发事件:

$("#mytext").trigger("change");
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*tow 60

从redsquare的出色建议来看,这很好用:

$.fn.changeVal = function (v) {
    return this.val(v).trigger("change");
}

$("#my-input").changeVal("Tyrannosaurus Rex");
Run Code Online (Sandbox Code Playgroud)

  • 你不需要包装`this`:`return this.val(v).trigger("change");` (4认同)

Yar*_* U. 27

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);
Run Code Online (Sandbox Code Playgroud)

一个工作的例子:这里

(请注意,即使值未实际更改,也会changeval(new_val)调用时始终触发.)

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

//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);
Run Code Online (Sandbox Code Playgroud)

实例:http://jsfiddle.net/5fSmx/1/

  • 嗯,不必要的鸭子修补,我认为:-p。可能会更好,如 [redsquare 评论](http://stackoverflow.com/questions/3179385/val-doesnt-trigger-change-in-jquery#comment3273526_3179392),给这样的函数一个不同于`.val 的名称()`。 (4认同)
  • 但是随后所有使用正确定义`.val()` 编写的代码都会突然开始产生副作用:-p。 (4认同)
  • 这也会使插件出现故障,这可能不太容易解决 (2认同)
  • 为了避免副作用,我修改了上面的 val 函数,但我触发了一个不同的事件(“val”),这让我可以保留现有代码,但在需要时可以轻松处理它: $(... ).on('改变val', ...) (2认同)
  • 如果您无法像使用外部库那样控制调用 `.val()` 的代码,这是一个很好的解决方案。如果触发自定义事件,它不会造成任何伤害。 (2认同)

Tim*_*lez 19

你需要像这样链接方法:

$('#input').val('test').change();
Run Code Online (Sandbox Code Playgroud)


Dar*_*rov 13

不需要在设置值后手动触发它:

$('#mytext').change();
Run Code Online (Sandbox Code Playgroud)

要么:

$('#mytext').trigger('change');
Run Code Online (Sandbox Code Playgroud)


Jay*_*dse 8

看起来这些事件并没有冒泡.试试这个:

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

我希望这有帮助.

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


cie*_*ung 5

截至 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();
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" id="txt">
Run Code Online (Sandbox Code Playgroud)

你必须.dispatchEvent()改用。

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

<input type="text" id="txt">
Run Code Online (Sandbox Code Playgroud)