5

我想选择一个带有两个 not 子句的特定节点,但到目前为止我没有成功。我需要做的是,选择一个元素,其 div 包含字符串 0008,但它不是 10008,而且它也不包含标签“style”,所以,理论上它应该像这样工作:

document.querySelectorAll(" div[id*='0008']:not([id='10008'][style])")

但是,正如您可能怀疑的那样,它不是那样工作的。

document.querySelectorAll(" div[id*='0008']:not([id='10008'])")
document.querySelectorAll(" div[id*='0008']:not([style])")

当然,它们都可以完美地单独工作。

4

3 回答 3

10

不是 10008,也不是……</p>

这不是您当前选择器检查的内容,它测试它是否没有( id 和 style 属性)。改用这个:

div[id*='0008']:not([id='10008']):not([style])

您的原始解决方案也不是有效的选择器,因为:not()可能只包含一个简单的选择器,而您有两个。然而,像 jQuery 的 sizzle 引擎这样的选择器库可能支持它们。因此,对于 jQuery,以下内容也可以使用:

div[id*='0008']:not([id='10008'],[style])
于 2013-02-14T22:08:15.510 回答
2

jsFiddle 演示

从逻辑上讲,您试图排除与两个不需要的选择器中的任何一个匹配的元素,而不是同时匹配它们的元素。在 jQuery 中,多重选择器(然后将匹配所有不需要的元素,然后被否定)只是一个逗号分隔的列表。因此,您只需这样做:

$("div[id*='0008']:not([id='10008'],[style])")

来自jQuery 文档(因为这个问题被标记为 jQuery):

内部接受所有选择器:not(),例如::not(div a):not(div,a)

于 2013-02-14T22:06:36.817 回答
0

我只是这样做:

var elems = $('div[id*="0008"]').filter(function() {
    return !this.hasAttribute("style") && this.id == '10008';
});

我不认为我真的明白这一点,但这会过滤掉:

<div id="10008" style="color: black">10008</div>

但不是:

<div id="10008">10008</div>

ID 当然是唯一的,并且可能有一个真实世界的用例,但它似乎仍然是一个边缘情况,你通常会以其他方式处理,因为一旦你过滤掉了 ID,你为什么要这样做还需要匹配样式标签吗?

于 2013-02-14T22:06:50.113 回答