2013-02-14 62 views
1

我要选择有两个条款没有一个特定的节点,但我没有成功为止。我需要做的是,选择一个元素,其div包含字符串0008,但它不是10008,也确实包含标记的“风格”,因此,在理论上它应该工作就像是:多不()DOM选择器

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

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

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

当然,它们都能单独工作。

+1

你尝试'$(” DIV [ID * = '0008']:不使用(风格):没有([ID = '10008'] )“)' – adeneo 2013-02-14 22:01:25

+0

这是'querySelectorAll'的预期行为。复杂的选择符不允许在':not()'中。由@adeneo提出的解决方案应该可以工作。 – 2013-02-14 22:02:35

+2

如果将它们结合起来,它表示不是具有两者的元素,但允许具有一个或另一个的元素。 – 2013-02-14 22:03:30

回答

2

jsFiddle Demo

从逻辑上讲,你想排除匹配任何两个干扰选择,不符合他们两个是元素的元素。在jQuery中,multiple selector(然后匹配所有不需要的元素,然后被否定)只是一个逗号分隔的列表。因此,你只需做到这一点:

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

jQuery docs(因为这个问题被标记的jQuery):

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

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当然是独一无二的,并且可能有一个真实世界的用例,但它直到看起来像你通常以其他方式处理的边缘案例,因为一旦你过滤了ID,为什么你还需要匹配样式标签呢?

+0

任何不使用'!this.style'的理由? (我真的很好奇,但没有那么多,所以我已经尝试过......) – 2013-02-14 22:10:21

+0

还没有测试过,但我猜'this.style'包含所有和任何样式,我认为点是检查实际属性,因此'hasAttribute()'。 – adeneo 2013-02-14 22:11:31

+1

@DavidThomas:是的。 'style'属性总是包含一个'CSSStyleDeclaration'对象,它是真实的 - 即使没有设置内联样式。 – Bergi 2013-02-14 22:12:47

5

不是10008,也它不...

这不是你目前选择的检查,它测试它是否有没有(ID和样式属性)。使用这个来代替:

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

你原来的解决方案还没有一个有效的选择,因为:not() may only contain one simple selector,而你有两个。然而,像jQuery的sizzle引擎那样的选择库可能会是support them。所以使用jQuery,下面的工作,以及:

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

div [id * ='0008']:not([id ='10008']):not([style])工作得很好,非常感谢。 – Aloc1234 2013-02-14 23:12:09