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

감사

답변:


108
$("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 2010-06-10

클래스를 추가하지 않으려면 $ ( "ul : first> li a")를 수행하십시오. 분명히 이것은 내부 수준이 아닌 첫 번째 수준에서만 작동합니다.
Alfonso

팁을 주셔서 감사합니다. 나는 이것도 테스트했고 잘 작동하는 것 같다 : ul.find(">li");"ul"노드가 ul 변수에 JQuery 객체로 있다면.
John Boe

55

초기 ul 이 있으면 해당 요소의 직계 자식 만 고려하는 children () 메서드를 사용할 수 있습니다 . @activa가 지적했듯이 루트 요소를 쉽게 선택하는 한 가지 방법은 클래스 또는 ID를 제공하는 것입니다. 다음은 id가있는 루트 ul이 있다고 가정합니다 root.

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

2
고마워요, 저에게 매우 도움이됩니다. $('ul').first().children('li')도 사용할 수있다
이반 블랙

이미 요소가 있으므로 .find 대신 .children을 사용하기 때문에 이것이 선호되는 대답입니다.
Herbert Van-Vliet

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 pastebin.com/JNBk77Vm
oriadam


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의 직계 하위 항목 만 가져 오는 데 사용할 수도 있습니다 .

동의합니다. 주 UL을 식별하려면 ID 또는 다른 것이 필요합니다. 그렇지 않으면 모두 선택됩니다. UL 주위에 ID가있는 div가있는 경우 가장 쉬운 방법은$("#someDiv > ul > li")


3
이 잘못된 사용법입니다 :first-child. 이렇게하면 "처음 li으로 "가 선택 됩니다 ul. 원래 게시물은 " li처음부터 모든 것 "을 요구했습니다 ul.
Courtney Christensen


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
이것은 심지어 질문에 의미가 않습니다
renke

>>> 그게 뭔데? 이 선택기에 이름이 있습니까? 유효한 선택자일까요? 아니면 농담 이었나요?
John Boe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.