jQuery/CSS 后代选择器选择太多

Posted

技术标签:

【中文标题】jQuery/CSS 后代选择器选择太多【英文标题】:jQuery/CSS descendent selector selecting too much 【发布时间】:2012-04-10 21:05:34 【问题描述】:

我的页面上有几个元素,其中一些包含在一个带有我关心的类的 div 中(在本例中为“workItemRow”)。我只希望元素具有类 workItemRow 的祖先来触发事件。问题是,每个元素都绑定到事件,而不仅仅是具有祖先的元素。

例如。 (实际代码的缩短版)

<div class="workItemRow">
<select class="objective"></select>
</div>

<div>
<select class="objective"></select>
</div>

然后是我的 jQuery:

$('body').on('change', '.workItemRow .objective', function () 
   alert("Why isn't this working?");
);

每次我更改第二个 div(没有任何类的那个)中的选择时,该事件仍然被触发,我不明白为什么。我尝试将选择器更改为“.workItemRow > .objective”,但它仍然总是调用它。

【问题讨论】:

它工作正常jsfiddle.net/8sREv 此代码是否在body 加载之前在head 中执行?请改用$(document).on... 它被包裹在 $(document).ready... 你的 JS 没有问题,所以还有其他事情发生。是否有更高级别的 .workItemRow 类允许匹配,即使您不想要它? 我想通了。我应该提到,每次更改 div 时,都会创建一个没有“workItemRow”类的新 div。此外,刚刚更改的 div 会添加“workItemRow”类。我不认为在事件完成解决之前添加类作为更改的结果会发生,但显然它确实发生了。 【参考方案1】:

你可以这样做:

$('body').on('change', '.workItemRow > .objective', function () 
   alert("Why isn't this working?");
);

将选择包含在 element.workItemRow 中的元素(.objective)

【讨论】:

以上是关于jQuery/CSS 后代选择器选择太多的主要内容,如果未能解决你的问题,请参考以下文章

后代选择器和子元素选择器的区别

在css中 比较 后代选择器和相邻选择器有啥区别 设计一个示例

CSS系列之后代选择器子选择器和相邻兄弟选择器

课时73.后代选择器和子元素选择器(理解)

CSSCSS 复合选择器 ③ ( 并集选择器 | 并集选择器与后代选择器示例 )

CSSCSS 复合选择器 ① ( 基础选择器与复合选择器 | 后代选择器 )