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

Javascript jQuery 1.8.0到1.8.1与.on()选择器不兼容,javascript,jquery,sizzle,Javascript,Jquery,Sizzle,我们刚刚偶然发现两个jQuery版本之间不兼容,这破坏了我们的一个应用程序。当从1.7更新到最新的2.1版本时,问题出现了,但缩小到1.8.0和1.8.1之间的差异 我已经做了一把小提琴和一把椅子 HTML 在1.8.0中,使用与所需元素匹配的选择器,选择器的一部分位于“上方”,事件上下文可以正常工作,与本机querySelector相同,而在1.8.1中则没有 这是一个有意的改变,还是我们可以期望在某个时候“修复”这一点?我想知道这是否是一个bug,因为它发生在补丁版本更新中,破坏了东西(至少

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

我已经做了一把小提琴和一把椅子

HTML

在1.8.0中,使用与所需元素匹配的选择器,选择器的一部分位于“上方”,事件上下文可以正常工作,与本机
querySelector
相同,而在1.8.1中则没有

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

来自:

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

这也是因为选择器是处理单击的元素的后代:

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

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

性能原因是有意义的!我仍将在一段时间内查看jQuery源代码,以了解到底发生了什么。如前所述,
querySelector
在这种情况下确实起作用,因此如果他们在幕后使用它,Sizzle将不得不做额外的工作来获得这种行为。感谢您的回答和在变更日志中指出这一行!我一定错过了。
$('.eventcontext').on('click', '.outer a.hasevent', function(e) {
    e.preventDefault();
    e.stopPropagation();

    $('#targetYep').show();
});
Events:    #12383: jQuery.on() selector should only apply to descendants of the element
$('.outer').on('click', '.eventcontext a.hasevent', function(e) { /**/ });
$('.outer').on('click', 'a.hasevent', function(e) { /**/ });