【问题标题】:jQuery 1.8.0 to 1.8.1 incompatibility with .on() selectorsjQuery 1.8.0 到 1.8.1 与 .on() 选择器不兼容
【发布时间】:2014-11-17 19:05:41
【问题描述】:

我们刚刚偶然发现了两个 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 中则可以不是。

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

【问题讨论】:

    标签: javascript jquery sizzle


    【解决方案1】:

    来自jQuery 1.8.1 Change Log

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

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

    同样有效,因为选择器是处理点击的元素的后代:

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

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

    【讨论】:

    • 性能原因说得通!我还是会看一下 jQuery 源代码,看看到底发生了什么。如前所述,querySelector 在这种情况下确实有效,因此如果他们在后台使用它,Sizzle 将不得不做额外的工作来获得这种行为。感谢您的回答并在更改日志中指出该行!我一定错过了。
    猜你喜欢
    • 2016-10-08
    • 2011-03-18
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2022-07-02
    • 1970-01-01
    • 2012-09-06
    • 2012-06-29
    相关资源
    最近更新 更多