当值由 val()
设置时,change()
事件处理程序中的逻辑不会运行,但当用户用鼠标选择一个值时它会运行。为什么是这样?
<select id="single">
<option>Single</option>
<option>Single2</option>
</select>
<script>
$(function() {
$(":input#single").change(function() {
/* Logic here does not execute when val() is used */
});
});
$("#single").val("Single2");
</script>
因为 change
事件需要用户发起的实际浏览器事件,而不是通过 javascript 代码。
改为这样做:
$("#single").val("Single2").trigger('change');
或者
$("#single").val("Single2").change();
我相信您可以使用 trigger()
手动触发更改事件:
$("#single").val("Single2").trigger('change');
虽然为什么它不会自动触发,但我不知道。
$('#foo').change(function() { $( this ).val( 'whatever' ); });
在 val() 之后添加这段代码似乎有效:
$(":input#single").trigger('change');
$(":input#single")
为它进行单独的 DOM 选择。事实上,你真的不应该。只需将其链接在 .val()
之后。您可以使用 .trigger('change')
或 .change()
。它们完全相同。
据我所知,API 的。该事件仅在用户单击选项时触发。
对于选择框、复选框和单选按钮,当用户使用鼠标进行选择时会立即触发该事件,但对于其他元素类型,该事件会延迟到元素失去焦点为止。
input
元素触发“更改”事件,而不是在元素失去焦点时触发。你知道吗?
为了使它更容易,添加一个自定义函数并在您想要更改值并触发更改时调用它:
$.fn.valAndTrigger = function (element) {
return $(this).val(element).trigger('change');
}
和
$("#sample").valAndTrigger("NewValue");
或者,您可以覆盖 val()
函数,以便在调用 val()
时始终调用更改:
(function ($) {
var originalVal = $.fn.val;
$.fn.val = function (value) {
this.trigger("change");
return originalVal.call(this, value);
};
})(jQuery);
http://jsfiddle.net/r60bfkub/ 的样品
change
事件并执行回调,该回调(直接或间接)再次触发同一控件上的 change
事件。我建议您为手动触发的事件使用另一个名称(例如 explicit.change
),这样它就不会重新触发 change
事件,防止循环,并且仍然允许您对事件做出反应.
如果您不想与默认更改事件混淆,您可以提供自定义事件
$('input.test').on('value_changed', function(e){
console.log('value changed to '+$(this).val());
});
要触发值集上的事件,您可以执行
$('input.test').val('I am a new value').trigger('value_changed');
如果您刚刚将选择选项添加到表单并且希望触发更改事件,我发现需要 setTimeout 否则 jQuery 不会选择新添加的选择框:
window.setTimeout(function() { jQuery('.languagedisplay').change();}, 1);
我在将 CMB2 与 Wordpress 一起使用时遇到了同样的问题,并想挂钩文件上传元框的更改事件。
因此,如果您无法修改调用更改的代码(在本例中为 CMB2 脚本),请使用以下代码。在设置值之后调用触发器,否则您的更改事件处理程序将起作用,但该值将是前一个,而不是正在设置的那个。
这是我使用的代码:
(function ($) {
var originalVal = $.fn.val;
$.fn.val = function (value) {
if (arguments.length >= 1) {
// setter invoked, do processing
return originalVal.call(this, value).trigger('change');
}
//getter invoked do processing
return originalVal.call(this);
};
})(jQuery);
$.fn.val
函数中检查 this.selector
以获取特定选择器(将取决于用于选择器的内容)。这是我发现的最好的仅针对特定字段执行此操作的方法,唯一的问题是您必须知道它们用于选择器的内容
$(":input#single").trigger('change');
这适用于我的脚本。我有 3 个组合并与 chainSelect 事件绑定,我需要通过 url 传递 3 个值并默认选择所有下拉列表。我用这个
$('#machineMake').val('<?php echo $_GET['headMake']; ?>').trigger('change');
第一个事件奏效了。
不定期副业成功案例分享