【问题标题】:jQuery Chosen not firing onchange event when value is changed through JS当通过JS更改值时,jQuery选择不触发onchange事件
【发布时间】:2012-06-23 01:11:25
【问题描述】:

JSFiddle

我在小提琴中设置了一个select 和 3 个options(1 个空白)。当我手动从foo 切换到bar 时,change 监听器会正常触发。

现在,如果我通过 JS 使用 code posted in some answers here 重置 select,则不会为新选择的空白选项触发 change 事件,此外,如果我选择在单击 @987654334 之前选择的选项@按钮onchange事件也不会触发。

我确定select 的值正在被上面的函数改变,这可以在这个fiddle 中看到,但是selectonchange 事件根本不会开火。

我也试过onchangeonclickoninput 事件无济于事。现在我想知道是否应该使用 MutationObserver 或从 DOM 中删除呈现的选定元素并创建另一个,但我可能想多了。任何帮助表示赞赏。

还有:

这个答案对我帮助很大:jQuery Chosen reset

这个答案没有帮助:how to fire onchange event in chosen prototype javascript select box?

如果 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>

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());
    });
});

【问题讨论】:

  • ASP.Net Webforms:当我的应用似乎有这个问题时,我遇到了这个问题,但事实证明这是由 ASP WebForm Validators 引起的 Javascript 错误。看到这个jQuery-UI ticket

标签: javascript jquery jquery-chosen


【解决方案1】:

使用$(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());
    });

【讨论】:

  • 还有foo -> reset -> foo 不会触发最后一个foo,但我现在应该能够自己弄清楚了。跨度>
  • @FabrícioMatté .chosen 的功能是什么?
  • .chosen 是 Chosen 插件本身,它将选择转换为 chosen 选择,dw 可能像往常一样在他们的代码中存在错误。 =]
  • 我已经解决了,有点丑陋的解决方案,但是是的,对于未来可能会遇到同样问题的人:$('#chosen_chzn').remove(); $('#chosen').val('').change().removeClass('chzn-done').chosen();Fiddle
  • #chosen 是上面代码中select 的ID,因此更合适的解决方案是:var selId = 'chosen'; $('#'+selId+'_chzn').remove(); $('#'+selId).val('').change().removeClass('chzn-done').chosen(); - Fiddle - 最后一点,Chosen 是最差的插件添加我见过的新功能。
【解决方案2】:

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

$('#chosen_chzn').remove();
$('#chosen').val('').change().removeClass('chzn-done').chosen();

See this on his Fiddle

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

【讨论】:

  • 实际上,我想我已经找到了另一个“更好”的解决方案。不太确定。我想我刚刚升级到Select 2,它会触发change 事件,只需在原始输入上调用.change()
  • +1 虽然对于那些坚持选择的人来说,我不完全记得删除 chzn-done 类的原因,但我很确定这是因为 chzn-done 适用于 display:noneselect 元素上调用 .chosen() ,并在具有该类的元素上调用 .chosen() 将不起作用。
  • 我相信如果你不删除 chzn-done 然后调用 selected() 什么都不做 - 它相信它已经设置好了。有点像一个可怜的男人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
相关资源
最近更新 更多