ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

E
Eugen Konkov

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();
F
Florian Lemaitre

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

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

$("#my-input").changeVal("Tyrannosaurus Rex");

Y
Yaron U.

您可以通过将 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('改变值', ...)
如果您无法像使用外部库一样控制调用 .val() 的代码,这是一个很好的解决方案。如果您触发自定义事件,它不会造成任何伤害。
T
Timothy Gonzalez

您需要像这样链接方法:

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

D
Darin Dimitrov

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

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

或者:

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

R
RAM

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

$("#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 元素更改的当前有效实现。
c
cieunteung

截至 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();

您必须改用 .dispatchEvent()

txt.addEventListener('input', function() { console.log('it works!'); }) $('#txt').val('yes') txt.dispatchEvent(new Event('input') );


S
Slipoch

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

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

S
Sky Yip

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

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