jqueryで第1レベルの要素のみを選択する


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に置き換えましたが、これらの種類のセレクターは現在正常に動作しています。あなたの返事と返事をくれたみんなに感謝します。
アストン

クラスを追加したくない場合は、$( "ul:first> li a")を実行するだけです。明らかに、これは最初のレベルでのみ機能し、内部レベルでは機能しません。
Alfonso

ヒントありがとうございます。私もこれをテストしましたが、うまく機能しているul.find(">li");ようです:ul変数にJQueryオブジェクトとして「ul」ノードがある場合。
John Boe

55

最初のulを取得したら、children()メソッドを使用できます。これは、要素の直接の子のみを考慮します。@activaが指摘するように、ルート要素を簡単に選択する1つの方法は、それにクラスまたは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セレクタ '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 +エッジがそれをサポートするだけでなく、ものです> :-(ので、ここだポリフィル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
コートニークリステンセン


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からのツリーレベルの子の2番目の.form-item


1
これは、質問に対しても意味をなさない
レンケ

>>>それは何ですか?このセレクターには名前がありますか?それは有効なセレクタですか?それとも冗談でしたか?
John Boe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.