【发布时间】:2015-01-27 20:08:47
【问题描述】:
我有一个案例,我需要在页面上选择不同的节点组,并且我需要排除某些子元素。我最常见的任务是选择所有 <img> 元素,但不选择某些元素的后代。
以我的小提琴为例:http://jsfiddle.net/rjdbys13/
我有 2 个<div>s,每个里面都有一个<img>。我想选择所有图像,但不是那些<div>s 之一中的图像(都具有不同的类)。
为此,它适用于 jQuery 和 Sizzlejs,我可以使用像 img:not(.amazingDiv img) 这样的选择器。据我了解,这会选择所有<img> 元素,这些元素不是<div>s 的后代,其类包含amazingDiv。正如我在支持更详细的:not 语法的库中所说的那样,这非常有效,但它会因querySelectorAll 中的错误而失败:
Uncaught SyntaxError: Failed to execute 'querySelectorAll' on 'Document': 'img:not(.amazingDiv img)' is not a valid selector.
我真的很想避免对我收集的元素进行任何“后期处理”,那么有没有办法通过使用querySelectorAll 来实现我正在寻找的东西? (我也尝试过使用库"qwery"、“micro-selector”和“nut”)
编辑:由于我搜索选择器组合以支持一些复杂的:not 功能没有结果,我选择使用第 3 方选择器引擎 - Jaguar (github.com/alpha123/捷豹)。这不是想法,而且速度较慢,但最终结果可能更有效,因为我不需要“后处理”我的结果。
【问题讨论】:
-
当你可以选择积极的条件时,为什么要选择消极的条件。
document.querySelectorAll(".amazingDiv2 img") -
@Vijay 那是完全正确的,但是我只使用了第二个 div 和类作为示例。我实际上希望所有图像不在某种描述的祖先之下。
-
如果你忽略 div 本身,它下面的所有图像都会被自动丢弃。
document.querySelectorAll("#parent div:not(.amazingDiv2) img")
标签: javascript css-selectors selectors-api