当我使用按钮更改其值时,我试图在文本框上触发 change
事件,但它不起作用。检查this fiddle。
如果您在文本框中键入内容并单击其他位置,则会触发 change
。但是,如果您单击该按钮,文本框的值会更改,但不会触发 change
。为什么?
onchange
仅在用户输入输入然后输入失去焦点时触发。
您可以在设置值后手动调用 onchange
事件:
$("#mytext").val( 777 ).change(); // someObject.onchange(); in standard JS
或者,您可以使用 trigger 事件:
$("#mytext").val( 777 ).trigger("change");
根据 redsquare 的优秀建议,这很好用:
$.fn.changeVal = function (v) {
return this.val(v).trigger("change");
}
$("#my-input").changeVal("Tyrannosaurus Rex");
您可以通过将 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/
.val()
的名称可能会更好。
.val()
编写的代码都会突然开始产生副作用:-p。
.val()
的代码,这是一个很好的解决方案。如果您触发自定义事件,它不会造成任何伤害。
您需要像这样链接方法:
$('#input').val('test').change();
不,您可能需要在设置值后手动触发它:
$('#mytext').change();
或者:
$('#mytext').trigger('change');
看起来事件并没有冒泡。尝试这个:
$("#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')
。
截至 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') );
我知道这是一个旧线程,但对于其他人来说,上述解决方案可能不如以下解决方案,而不是检查 change
事件,而是检查 input
事件。
$("#myInput").on("input", function() {
// Print entered value in a div box
$("#result").text($(this).val());
});
从 https://api.jquery.com/change/:
change
事件在其值更改时发送到元素。此事件仅限于 <input>
个元素、<textarea>
个框和 <select>
个元素。对于选择框、复选框和单选按钮,当用户使用鼠标进行选择时会立即触发该事件,但对于其他元素类型,该事件会延迟到元素失去焦点为止。
不定期副业成功案例分享
.change()
链接到.val()
方法的选项。.change()
中调用了.val()
,因为他们进行了输入验证。在.val()
上触发.change()
会导致无限循环。blur
以完成类似的事情:$('#mytext').focus().val('New text').blur();