2009-07-02 95 views
45

我知道如何获得元素具有特定属性:我怎样才能不特定属性的元素的jQuery

$("#para [attr_all]") 

但我怎么能获得一个不带特定属性的元素? 我试试

$("#para :not([attr_all])") 

但它不起作用。 这是做什么的正确方法?

让我举一个例子:

<div id="para"> 
    <input name="fname" optional="1"> 
    <input name="lname"> 
    <input name="email"> 
</div> 

的jQuery:

$("#para [optional]") // give me the fname element 
$("#para :not([optional])") //give me the fname, lname, email (fname should not appear here) 

回答

18

第一件事:

$('p').filter(function(){ 
    return !$(this).attr('attr_all'); 
}); 

然而p:not([attr_all])应该工作,所以我想别的东西在你的代码是怎么回事。

+1

我终于解决了这个问题和它是由另一部分代码引起的,所以我会将其标记为答案。 – Billy 2010-01-08 16:48:52

5

尝试$("#para [attr!=val]")

你的:not真的应该工作,但这使我怀疑还有其他事情正在发生。

有关属性选择器的完整列表,请参阅jQuery Selectors docs

是在我脑海中(也许次优)
+0

它不起作用。 – Billy 2009-07-02 11:18:44

+0

是的,我认为你的问题是在上下文中,而不是这个选择器。 – chaos 2009-07-02 11:19:55

+0

+1。请注意,这个选择器是特定于JQuery的。它没有被定义为一个CSS属性选择器,所以它不能用于定位样式元素(通过CSS):http://www.w3.org/TR/CSS2/selector.html#attribute-selectors – PatrikAkerstrand 2009-07-02 11:20:50

102

如果你的代码示例是你正在使用的确切代码,我认为这个问题是一个错误的空间。

$("#para :not([attr_all])") 

应该

$("#para:not([attr_all])") 

如果在留出空间存在,它选择后裔#para

7

更快的方法是首先获取所有带有ID para的元素(如果存在多个元素,则为无效的HTML,请考虑使用类来代替)并使用过滤器(或者根据HTML构造)方法只能获得无属性的元素,像这样:

$('#para').filter(':not([attr_all])'); 

这样做你有jQuery的做少得多的工作,因为你只能通过元素的一个较小的子循环,从而让那些没有属性。使用单个选择器语句(例如$("#para :not([attr_all])"))执行此操作将导致jQuery获取所有没有该属性的元素,然后过滤它们以获得para的ID。

1

弗兰克德罗莎的答案是关于正确的,但由于OP确实想找到后代,所以有点关闭。自己尝试一下,似乎应该按照它的方式工作,但可能无论你运行什么都不喜欢':'运算符被直接用作后代。尝试使用

$("#para input:not([optional])") 

会留下评论,但还不能。

相关问题