在jQuery中仅选择第一级元素


93

如何<ul>从这样的列表中选择仅父级的链接元素?

<ul>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a>
  <ul>
    <li><a href="#">Link</a></li>
    <li><a href="#">Link</a></li>
    <li><a href="#">Link</a></li>
    <li><a href="#">Link</a></li>
    <li><a href="#">Link</a></li>
  </ul>
</li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>

所以在css中ul li a,但不是ul li ul li a

谢谢

Answers:


108
$("ul > li a")

但是,如果您要专门针对最外层的ul,则需要在根ul上设置一个类:

<ul class="rootlist">
...

然后是:

$("ul.rootlist > li a")....

确保您只有root li元素的另一种方法:

$("ul > li a").not("ul li ul a")

它看起来很笨拙,但可以解决问题


嗯,我发现我的问题是使用jQuery 1.2。我已将其替换为1.3,这些选择器现在工作正常。非常感谢您的答复和每个答复的人。
阿斯顿·

如果您不想添加类,只需执行$(“ ul:first> li a”)显然这仅适用于第一级,而不适用于内部级。
阿方索

谢谢您的提示。我也对此进行了测试,似乎效果很好:ul.find(">li");如果您将“ ul”节点作为ul变量中的JQuery对象使用。
约翰·波

55

一旦有了初始ul,就可以使用children()方法,该方法仅考虑元素的直接子级。正如@activa指出的那样,一种轻松选择根元素的方法是为它提供一个类或一个id。以下假定您具有id的根ul root

$('ul#root').children('li');

2
谢谢,对我非常有帮助。一个$('ul').first().children('li')也可以使用
伊万黑色

这是我的首选答案,因为我已经有了该元素,因此将使用.children而不是.find。
赫伯特·范弗利特

7

如其他答案所述,最简单的方法是唯一标识根元素(按ID或类名)并使用直接后代选择器。

$('ul.topMenu > li > a')

然而,我在寻找一个解决方案,将在工作中碰到这个问题,他们不愿透露姓名的元素不同深度 DOM的。

这可以通过检查每个元素并确保其在匹配元素列表中没有父元素来实现。这是我的解决方案,包装在jQuery选择器“最高”中。

jQuery.extend(jQuery.expr[':'], {
  topmost: function (e, index, match, array) {
    for (var i = 0; i < array.length; i++) {
      if (array[i] !== false && $(e).parents().index(array[i]) >= 0) {
        return false;
      }
    }
    return true;
  }
});

利用这一点,原始帖子的解决方案是:

$('ul:topmost > li > a')

// Or, more simply:
$('li:topmost > a')

完整的jsFiddle 在这里可用。


通过使用新的DOM方法,您可以极大地提高:topmost尝试使用的性能.parentElement.closest(selector)。像往常一样,IE + Edge是唯一不支持它的人> :-(所以这是一个
polyfill


3

如果结果仍然向下流到子级,您可能想尝试一下,在许多情况下,JQuery仍将应用于子级。

$("ul.rootlist > li > a")

使用此方法:E> F匹配作为元素E的子元素的任何F元素。

告诉JQuery仅查找显式子级。 http://www.w3.org/TR/CSS2/selector.html


0

您还可以$("ul li:first-child")用来仅获取UL的直接子级。

我同意,但是您需要一个ID或其他东西来标识主要的UL,否则它将全部选中它们。如果您的div的ID在UL周围,那么最简单的方法是$("#someDiv > ul > li")


3
这是的不正确用法:first-child。这将选择“第li一个ul”。原始帖子要求“ li从头开始的每个人ul”。
Courtney Christensen 2012年


0

我从任何深度都对嵌套类有一些麻烦,所以我想出了办法。它将仅选择遇到的包含Jquery对象的第一级:

var $elementsAll = $("#container").find(".fooClass");4

var $levelOneElements = $elementsAll.not($elementsAll.children().find($elementsAll));

$levelOneElements.css({"color":"red"})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div class="fooClass" style="color:black">
Container
  <div id="container">
    <div class="fooClass" style="color:black">
      Level One
      <div>
        <div class="fooClass" style="color:black">
             Level Two
        </div>
      </div>
    </div>
    <div class="fooClass" style="color:black">
      Level One
      <div>
        <div class="fooClass" style="color:black">
             Level Two
        </div>
      </div>
    </div>
  </div>
</div>


0

1个

 $("ul.rootlist > target-element")
2   $("ul.rootlist").find(target-element).eq(0) (only one instance)
3   $("ul.rootlist").children(target-element)

可能还有许多其他方式


-1
.add_to_cart >>> .form-item:eq(1)

.add_to_cart中树级别子级的第二个.form-item


1
这个问题甚至都没有道理
伦克

>>>那是什么?这个选择器有名字吗?它甚至是有效的选择器吗?还是在开玩笑?
约翰·波
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.