当我使用val()设置select的值时,为什么jquery更改事件不会触发?

Eri*_*air 370 html jquery select input

change()当值设置时,事件处理程序中的逻辑不会运行val(),但它会在用户使用鼠标选择值时运行.为什么是这样?

<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>
Run Code Online (Sandbox Code Playgroud)

use*_*716 580

因为change事件需要用户发起的实际浏览器事件而不是通过javascript代码.

改为:

$("#single").val("Single2").trigger('change');
Run Code Online (Sandbox Code Playgroud)

要么

$("#single").val("Single2").change();
Run Code Online (Sandbox Code Playgroud)

  • 我同意这是正确的答案,但这绝对糟透了,并且破坏了我想要做的事情. (4认同)
  • 我挖掘这个答案.它有效,但jQuery没有更好的方法吗?我确信每次我们更改设置了更改处理程序的值(讽刺)时,我们都会记得这样做.使用数据绑定的框架可以更好地解决这个问题吗? (3认同)

Dav*_*mas 44

我相信您可以手动触发更改事件trigger():

$("#single").val("Single2").trigger('change');
Run Code Online (Sandbox Code Playgroud)

虽然它为什么不自动开火,但我不知道.

  • 一个"位"迟来但它不会自动触发,因为它会导致无限循环.想想`$('#foo').change(function(){$(this).val('whatever');});` (4认同)

Eri*_*air 9

在val()之后添加这段代码似乎有效:

$(":input#single").trigger('change');
Run Code Online (Sandbox Code Playgroud)

  • 是的,但你不需要为`$(":input#single")`做一个单独的DOM选择.事实上你真的不应该.只需在`.val()`后链接它.你可以使用`.trigger('change')`或`.change()`.它们完全相同. (6认同)

Mar*_*nix 8

据我所知,在API中.只有在用户单击选项时才会触发该事件.

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

对于选择框,复选框和单选按钮,当用户使用鼠标进行选择时会立即触发事件,但对于其他元素类型,事件将延迟,直到元素失去焦点.


Ali*_*ahi 6

为了方便起见,添加自定义函数并在您想要更改值时调用它也会触发更改

$.fn.valAndTrigger = function (element) {
    return $(this).val(element).trigger('change');
}
Run Code Online (Sandbox Code Playgroud)

$("#sample").valAndTirgger("NewValue");
Run Code Online (Sandbox Code Playgroud)

或者,您可以覆盖val函数,以便在调用val时始终调用更改

(function ($) {
    var originalVal = $.fn.val;
    $.fn.val = function (value) {
        this.trigger("change");
        return originalVal.call(this, value);
    };
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/r60bfkub/上的示例