使用 querySelectorAll 的选择器无效:不适用于后代

Invalid selector with querySelectorAll :not with descendants

我有一个案例,我需要 select 页面上的不同节点组,并且我需要 排除 某些子元素。我最常见的任务是 selecting 所有 <img> 元素,但不是某些元素的后代。

以我的 fiddle 为例:http://jsfiddle.net/rjdbys13/ 我有 2 个 <div>,每个里面都有一个 <img>。我想要 select 所有图像,但不是那些 <div> 之一中的图像(两者都具有不同的 classes)。

为此,这在 jQuery 和 Sizzlejs 中有效,我可以使用 select 或 img:not(.amazingDiv img)。据我了解,这 select 的所有 <img> 元素都不是 <div> 的后代,class 包含 amazingDiv。正如我所说的那样,这对支持更详细 :not 语法的库非常有用,但它失败并出现 querySelectorAll:

中的错误

Uncaught SyntaxError: Failed to execute 'querySelectorAll' on 'Document': 'img:not(.amazingDiv img)' is not a valid selector.

我真的很想避免对我收集的元素做任何 "post processing",那么有没有办法通过使用 querySelectorAll 来实现我正在寻找的东西? (我也尝试过使用库 "qwery"、"micro-selector" 和 "nut")

编辑:由于我搜索 select 或支持某些复杂 :not 功能的组合没有结果,我选择使用第三个派对 select 或引擎 - 捷豹 (github.com/alpha123/Jaguar)。这不是主意,而且速度较慢,但​​最终结果可能更有效,因为我不需要 "post process" 我的结果。

根据规范,您使用的选择器不正确:

Selectors level 3 does not allow anything more than a single simple selector within a :not() pseudo-class.

The negation pseudo-class, :not(X), is a functional notation taking a simple selector (excluding the negation pseudo-class itself) as an argument. It represents an element that is not represented by its argument.

遗憾的是,标准 CSS select 或目前无法实现您想要执行的操作。目前,:not() only accepts a single simple selector at a time,所以它的使用非常有限。

在即将推出的标准 :not() will be upgraded to allow combinators and complex selectors 中,其功能将与 select 或库提供的功能相媲美。这意味着,最终,您使用的将是有效的 select 或者一旦浏览器开始实施增强功能。

但与此同时,假设您还不能 select 使用不同的 select 或不使用 :not() 的元素,您将不会如果不 selecting 所有 img 元素并单独排除 .amazingDiv img(在这些元素上说 "post processing"),则无法做到这一点。

如果您忽略 div 本身,那下面的所有图像都会自动被丢弃。

document.querySelectorAll("#parent div:not(.amazingDiv2) img")