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

jQuery 1.8.0 to 1.8.1 incompatibility with .on() selectors

本文关键字:选择器 不兼容 jQuery on      更新时间:2023-09-26

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

我在这里(1.8.0,

工作)和这里(1.8.1,坏了)建立了一个小提琴。

.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 中则没有。

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

来自 jQuery 1.8.1 更改日志:

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) { /**/ });

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