Выбор только элементов первого уровня в jquery - PullRequest
90 голосов
/ 11 июня 2009

Как я могу выбрать элементы ссылки только родительского <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

Спасибо

Ответы [ 10 ]

103 голосов
/ 11 июня 2009
$("ul > li a")

Но вам нужно установить класс в корневом каталоге ul, если вы специально хотите нацелиться на самый внешний ul:

<ul class="rootlist">
...

Тогда это:

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

Еще один способ убедиться, что у вас есть только корневые элементы li:

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

Это выглядит глупо, но это должно сработать

52 голосов
/ 11 июня 2009

Получив начальный ul, вы можете использовать метод children () , который будет учитывать только непосредственные дочерние элементы элемента. Как указывает @activa, одним из способов легко выбрать корневой элемент является присвоение ему класса или идентификатора. Предполагается, что у вас есть root ul с идентификатором root.

$('ul#root').children('li');
7 голосов
/ 11 января 2012

Как указано в других ответах, самый простой метод состоит в том, чтобы однозначно идентифицировать корневой элемент (по идентификатору или имени класса) и использовать прямой селектор потомков.

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

Однако я столкнулся с этим вопросом в поисках решения, которое бы работало на неназванных элементах на различной глубине DOM.

Этого можно достичь, проверив каждый элемент и убедившись, что у него нет родителя в списке соответствующих элементов. Вот мое решение , обернутое в селектор jQuery 'topmost'.

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 доступна здесь .

3 голосов
/ 07 ноября 2017

Просто вы можете использовать это ..

$("ul li a").click(function() {
  $(this).parent().find(">ul")...Something;
}

См. Пример: https://codepen.io/gmkhussain/pen/XzjgRE

3 голосов
/ 10 июня 2011

Возможно, вы захотите попробовать это, если результаты по-прежнему передаются детям, во многих случаях JQuery будет по-прежнему применяться к детям.

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

Используя этот метод: E> F Соответствует любому элементу F, являющемуся дочерним элементом элемента E.

Говорит JQuery искать только явных потомков. http://www.w3.org/TR/CSS2/selector.html

0 голосов
/ 27 апреля 2018

1

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

вероятно, есть много других способов

0 голосов
/ 01 мая 2017

У меня были проблемы с вложенными классами любой глубины, поэтому я понял это. Он выберет только первый уровень, с которым он столкнется, из объекта 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 голосов
/ 28 октября 2014

Попробуйте это:

$("#myId > UL > LI")
0 голосов
/ 14 июля 2010
.add_to_cart >>> .form-item:eq(1)

второй элемент .form на дочернем уровне дерева из .add_to_cart

0 голосов
/ 11 июня 2009

Вы также можете использовать $("ul li:first-child"), чтобы получить только прямых детей UL.

Я согласен, однако, вам нужен идентификатор или что-то еще, чтобы идентифицировать основной UL, иначе он просто выберет их все. Если бы у вас был div с идентификатором вокруг UL, проще всего было бы сделать $("#someDiv > ul > li")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...