当通过JS更改值时,jQuery选择不触发onchange事件

Fab*_*tté 9 javascript jquery jquery-chosen

的jsfiddle

我在小提琴中设置了select3 option秒(1个空白).当我从手动切换foobar手动时,change监听器会正常触发.

现在,如果我select使用在此处的某些答案中发布代码重置直通JS ,则change事件不会针对新选择的空白选项触发,此外,如果我选择在单击reset按钮之前选择的选项,则onchange事件将不会触发.

我敢肯定select的价值被上面的功能,都可以在此看到改变小提琴,但selectonchange事件根本不火.

我也试过onchange,onclick,oninput事件无济于事.现在我想知道我是否应该使用MutationObserver或从DOM中删除渲染的选定元素并创建另一个,但我可能会过度思考它.任何帮助表示赞赏.

也:

这个答案对我有很大帮助:jQuery Chosen重置

这个答案没有帮助:如何在选择的原型javascript选择框中触发onchange事件?

如果jsfiddle.net被删除,将来参考的代码:

HTML

<div id="wrapper">
    <select id="chosen">
        <option value="!!EMPTY VALUE!!"></option>
        <option value="foo">foo</option>
        <option value="bar">bar</option>
    </select>
</div>
<br>
<button id="reset">Reset</button>
Run Code Online (Sandbox Code Playgroud)

JS

$(function() {
    $('#chosen').chosen();

    $('#wrapper').on('change', '#chosen', function() {
        console.log('onchange: ' + this.value);
    });

    $('#reset').click(function() {
        $("#chosen").val('').trigger("liszt:updated"); //doesn't work
        //$("#chosen").prop('selectedIndex', 0).trigger("liszt:updated"); //doesn't work either
        console.log('reset: ' + $('option:selected').val());
    });
});
Run Code Online (Sandbox Code Playgroud)

Ada*_*eld 9

您需要在更改值后触发更改 $(selector).trigger("change")

$('#reset').click(function() {
        $("#chosen").val('').trigger("change"); //doesn't work
        //$("#chosen").prop('selectedIndex', 0).trigger("liszt:updated");
        console.log('reset: ' + $('option:selected').val());
    });
Run Code Online (Sandbox Code Playgroud)

  • `#selected`是上面代码中`select`的ID,所以更合适的解决方案:`var selId ='selected'; $( '#' + selId + '_ chzn')删除(); $('#'+ selId).val('').change().removeClass('chzn-done').selected();` - [**Fiddle**](http://jsfiddle.net/ ult_combo/y6BCP/3 /) - 最后一点,Chosen是添加我见过的新功能的最差插件. (3认同)

Tyl*_*ler 5

从对我有用的 Fabrício Matté 的评论中复制一个答案,这样其他人就不会看到这篇文章,也不会像我一样一开始就错过了一个解决方案。

$('#chosen_chzn').remove();
$('#chosen').val('').change().removeClass('chzn-done').chosen();
Run Code Online (Sandbox Code Playgroud)

在他的小提琴上看到这个

我最初尝试继续使用.trigger('liszt:updated')呼叫而不是 ,.change()但这没有用。也没有看到背后的原因.removeClass('chzn-done'),但这也是必不可少的,否则您的选择框将消失。

  • 实际上,我想我已经找到了另一个“更好”的解决方案。不太确定。我想我刚刚升级到 [Select 2](http://ivaynberg.github.com/select2/),它通过在原始输入上调用 `.change()` 来触发 `change` 事件。 (3认同)