jQuery 1.8.0到1.8.1与.on()选择器不兼容

时间:2014-11-17 10:12:35

标签: javascript jquery sizzle

我们偶然发现两个jQuery版本之间的不兼容性正在打破我们的一个应用程序。当从1.7更新到最新的2.1版本时出现问题,但是缩小到1.8.0和1.8.1之间的差异。

我已经建立了一个小提琴here (1.8.0, working)here (1.8.1, broken)

HTML

<div class="outer">
    <div class="eventcontext">
        <a href="#targetNope" class="hasevent">Click me!</a>
    </div>
</div>

JS

$('.eventcontext').on('click', '.outer a.hasevent', function(e) {
    e.preventDefault();
    e.stopPropagation();

    $('#targetYep').show();
});

在1.8.0中使用与所需元素匹配的选择器,选择器的一部分位于“上方”,事件上下文的工作没有任何问题,与原生querySelector的工作方式相同,而在1.8.1中它没有。

这是故意改变还是我们可以期望在某些时候“固定”?我想知道这可能是一个错误,因为它发生在补丁版本更新中,破坏了东西(至少在我们的情况下),但在最新版本中仍然是相同的。

1 个答案:

答案 0 :(得分:1)

来自jQuery 1.8.1 Change Log

Events:    #12383: jQuery.on() selector should only apply to descendants of the element

因此,当您从选择器中移除.outer时,它就会起作用。

还可以工作,因为selector是处理点击的元素的后代:

$('.outer').on('click', '.eventcontext a.hasevent', function(e) { /**/ });
$('.outer').on('click', 'a.hasevent', function(e) { /**/ });

猜测改变的原因:旧版本必须搜索整个文档以找到由选择器匹配的元素,这很慢。对于事件委派,搜索外部处理事件的元素是没有意义的。