【问题标题】:Jquery: select all elements except one with specific child with specific attributeJquery:选择所有元素,除了一个具有特定属性的特定子元素
【发布时间】:2012-05-20 17:16:47
【问题描述】:

假设我有这样的事情:

<div class="testdiv">
    <a href="/link1">link 1</a>
</div>
<div class="testdiv">
    <a href="/link2">link 2</a>
</div>
<div class="testdiv">
    <a href="/link3">link 3</a>
</div>
<div class="testdiv">
    <a href="/link4">link 4</a>
</div>

现在我想选择类testdiv 的所有&lt;div&gt;s,除了div 有一个子&lt;a&gt; 和属性href="/link3",如何用jQuery 做到这一点?

我知道我能做到:

$('div.testdiv')

【问题讨论】:

    标签: jquery jquery-selectors


    【解决方案1】:

    使用:not + :has 只需一个选择器即可轻松完成:

    $('div.testdiv:not(:has(a[href="/link3"]))')
    

    如果您不引用属性中的值(“CSS 标识符”),则需要使用两个反斜杠(\\)转义斜杠(/):

    $('div.testdiv:not(:has(a[href=\\/link3]))')
    

    Live DEMO

    如果一个 div 中只能有一个锚点,你可以这样:

    $('div.testdiv:has(a[href!="\\/link3")')
    

    【讨论】:

    • 我喜欢你编写脚本的方式,但它仍然毫无例外地选择了所有 div
    • @evilReiko。抱歉,缺少]...我修复了它并添加了一个演示
    • 很确定只有在不引用属性值时才需要这样做。
    • @evilReiko。如果它是一个变量,我不会使用它们,我会将它们添加到变量值中。无论如何,正如boltclock所提到的,只要你使用引号,它就可以在没有它们的情况下工作。无论如何我都会保留它们。
    • CSS spec 提到了字符串(带引号)和标识符(不带引号)之间的区别。自从允许不带引号的属性选择器以来,jQuery 似乎遵循相同的规则集。
    【解决方案2】:

    您可以为此使用filter

    var elements = $('.testdiv').filter(function(){
        return !$(this).find('a[href=\\/link3]').length;
    });
    

    【讨论】:

    • 您需要使用 `\\` 转义 /
    • 感谢您的回答,但仍然毫无例外地选择所有div!
    • @evilReiko。是的,那是因为filter 的第一个参数是索引,而不是元素...请参阅this demo 了解如何使用filter。 $Will,修复它,我会支持它。
    • @gdoron:我的错;我今天不在。
    • 请允许我改进一下。
    【解决方案3】:
    $('div.testdiv a[href^=/link3').parents();
    

    【讨论】:

    • 这将选择a 元素,而不是divs。
    • parents 将选择(不想要的)div 的所有父级直到&lt;body&gt;....
    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 2011-10-13
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2011-02-02
    相关资源
    最近更新 更多