val()在jQuery中不触发change()
我试图触发文本框上的change
事件,当我用button更改它的值,但它不起作用。 检查这个小提琴 。
如果您在文本框中键入内容并单击其他位置,则会触发change
。 但是,如果单击该button,则文本框的值会更改,但change
不会触发。 为什么?
onchange
仅在用户inputinput时触发,然后input失去焦点。
您可以在设置值后手动调用onchange
事件:
$("#mytext").change(); // someObject.onchange(); in standard JS
或者,您可以使用以下方式触发事件:
$("#mytext").trigger("change");
从redsquare的优秀build议,这很好地工作:
$.fn.changeVal = function (v) { return $(this).val(v).trigger("change"); } $("#my-input").changeVal("Tyrannosaurus Rex");
您可以非常轻松地覆盖val
函数来触发更改,将其replace为原始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);
一个工作的例子: 在这里
(注意,当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/
不,您可能需要在设置值后手动触发它:
$('#mytext').change();
要么:
$('#mytext').trigger('change');
你需要像这样链接方法:
$('#input').val('test').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')
只有当它改变。
从https://api.jquery.com/change/ :
当change
事件的值发生更改时,将change
事件发送到元素。 此事件仅限于<input>
元素, <textarea>
框和<select>
元素。 对于select框,checkbox和单选button,当用户使用鼠标进行select时,会立即触发事件,但对于其他元素types,事件将被推迟,直到元素失去焦点。