当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>

当前回答

就我所能读到的API。该事件仅在用户单击某个选项时触发。

http://api.jquery.com/change/

对于选择框、复选框和 单选按钮,事件被触发 当用户执行 用鼠标选择,但对于 事件的其他元素类型 延迟,直到元素丢失 的焦点。

其他回答

就我所能读到的API。该事件仅在用户单击某个选项时触发。

http://api.jquery.com/change/

对于选择框、复选框和 单选按钮,事件被触发 当用户执行 用鼠标选择,但对于 事件的其他元素类型 延迟,直到元素丢失 的焦点。

因为更改事件需要由用户发起的实际浏览器事件,而不是通过javascript代码。

你可以这样做:

$("#single").val("Single2").trigger('change');

or

$("#single").val("Single2").change();

在val()之后添加这段代码似乎可以工作:

$(":input#single").trigger('change');

我在使用cb2和Wordpress时遇到了同样的问题,并且想要钩入文件上传metabox的更改事件。

因此,如果您不能修改调用更改的代码(在本例中是cb2脚本),请使用下面的代码。 触发器将在值设置之后被调用,否则您的更改eventHandler将工作,但该值将是前一个值,而不是正在设置的值。

下面是我使用的代码:

(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);
$(":input#single").trigger('change');

这对我的剧本很管用。我有3个组合和绑定与chainSelect事件,我需要通过url和默认选择3个值都下拉。我用了这个

$('#machineMake').val('<?php echo $_GET['headMake']; ?>').trigger('change');

第一个活动成功了。