Выбор только элементов первого уровня в jquery

94

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

Благодарность

Астон
источник

Ответы:

109
$("ul > li a")

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

<ul class="rootlist">
...

Тогда это:

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

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

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

Это выглядит неуклюже, но это должно помочь

Филипп Лейберт
источник
Хм, я обнаружил, что моя проблема связана с использованием jquery 1.2. Я заменил его на 1.3, и теперь такие селекторы работают нормально. Большое спасибо за ваш ответ и всем, кто ответил.
Aston
Если вы не хотите добавлять класс, просто выполните $ ("ul: first> li a"), очевидно, это будет работать только для первого уровня, а не для внутренних уровней.
Альфонсо
Спасибо за отзыв. Я тоже это тестировал, и, похоже, он работает хорошо: ul.find(">li");если у вас есть узел "ul" как объект JQuery в переменной ul.
Джон Бо
57

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

$('ul#root').children('li');
tvanfosson
источник
2
Спасибо, это очень помогло мне. $('ul').first().children('li')Также может быть использован
Иван Черный
Для меня это предпочтительный ответ, так как у меня уже есть элемент, поэтому я буду использовать .children вместо .find.
Герберт Ван-Влит,
7

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

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

Кортни Кристенсен
источник
Используя новые методы DOM, вы можете значительно повысить производительность :topmost- попробуйте использовать .parentElement.closest(selector). Как всегда, IE + Edge - единственные, кто не поддерживает его> :-( так что вот полифилл pastebin.com/JNBk77Vm
oriadam
3

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

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

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

Указывает JQuery искать только явные дочерние элементы. http://www.w3.org/TR/CSS2/selector.html

TitanKing
источник
0

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

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

CBarr
источник
3
Это неправильное использование :first-child. Это выберет «первым liиз каждого ul». В исходном посте просили «каждый liс первого ul».
Кортни Кристенсен
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)

второй .form-item на уровне дерева потомок от .add_to_cart

Исидоро
источник
1
Это даже не имеет смысла в вопросе
Renke
>>> Что это? У этого селектора есть имя? Это вообще действующий селектор? Или это была шутка?
Джон Бо