如何通过jQuery获取没有特定属性的元素

时间:2009-07-02 11:13:24

标签: 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)  

7 个答案:

答案 0 :(得分:111)

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

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

应该是

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

如果你在那里留一个空格,它会选择#para后代

答案 1 :(得分:19)

我想到的第一件事(可能是次优的):

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

p:not([attr_all])应该有效,所以我认为您的代码中还会发生其他事情。

答案 2 :(得分:7)

更快的方法是首先获取ID为para的所有元素(如果有多个,则为无效HTML,请考虑使用类)并使用过滤器(或根据HTML的方式查找)构造)方法只获取没有属性的元素,如下所示:

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

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

答案 3 :(得分:5)

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

你的:not确实应该有用,这让我怀疑其他事情正在发生。

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

答案 4 :(得分:1)

Frank DeRosa的回答是正确的,但由于OP确实想要找到后代,所以有点过时了。自己尝试一下,它似乎应该按照它的方式工作,但是你运行的任何东西都可能不喜欢':'运算符直接用作后代。尝试使用

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

本来会留下评论,但还不能。

答案 5 :(得分:0)

查看CSS3选择器文档,选择没有属性“ attr”的节点“ node”的正确方法是:

<node>:not(<node>[<attr>])

E.g.: p:not(p[align])

在您的情况下,$("#para *:not([optional])")可行,并且可能更精确。

:不是”的实际语法是:

<selector1>:not(<selector2>)

此表达式中有两个选择器,它选择所有与 seletor1 匹配的节点,然后排除所有与 selector2 匹配的节点。

我会使用:

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

    /* or */

$('input:not(input[optional])',$('#para'))

    /* in case jQuery has issues with :not */

$( document.querySelectorAll('#para input:not(input[optional])') )

答案 6 :(得分:0)

找到没有alt属性或空alt标签的图像标签。

$('img').each(function( index ) {
    if(typeof $(this).attr('alt') === typeof undefined || $(this).attr('alt') === false ||$(this).attr('alt') === '') {
        console.log(index);
    }
});