2009-06-10 4 views
75

Как выбрать элементы ссылки только для родителя <ul> из списка, подобного этому?Выбор только элементов первого уровня в jquery

<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

Благодаря

ответ

88
$("ul > li a") 

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

<ul class="rootlist"> 
... 

Тогда это:

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

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

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

Это выглядит запутано, но он должен сделать трюк

+0

Хм Я обнаружил, что проблема связана с использованием jquery 1.2. Я заменил его на 1.3, и теперь эти селекторы работают нормально. Большое спасибо за ваш ответ и все, кто ответил. – aston

+0

Если вы не хотите добавлять класс, просто выполните $ ("ul: first> li a"), очевидно, это будет работать только для первого уровня, а не для внутренних уровней. – Alfonso

+0

$ ("ul> li a"). Not ("ul li ul a") его рабочий штраф. – vicky

44

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

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

Спасибо, это очень полезно для меня. Можно также использовать '$ ('ul'). First(). Children ('li')' также можно использовать –

0

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

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

+2

Это неправильное использование ': first-child'. Это выберет «первый« ли »каждого' ul'. Первоначальный пост запрашивал «каждый« ли »с первого« ul ». –

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

второй .form-элемент на уровне дерева ребенка от .add_to_cart

+0

Это даже не имеет смысла на вопрос – renke

3

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

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

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

Рассказывает JQuery только для поиска явных детей. http://www.w3.org/TR/CSS2/selector.html

+0

этот фактически работает –

7

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

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

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

Это может быть достигнуто путем проверки каждого элемента и обеспечения отсутствия родителя в списке согласованных элементов.Вот мой solution, завернутый в селектор 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 доступны here.

+0

Здесь очень хорошо работает! – 2012-07-18 15:01:46

+0

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

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>