Memilih hanya elemen level pertama di jquery


93

Bagaimana cara memilih elemen tautan hanya dari induk <ul>dari daftar seperti ini?

<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>

Jadi di css ul li a, tapi tidakul li ul li a

Terima kasih

Jawaban:


108
$("ul > li a")

Tetapi Anda perlu menetapkan kelas di root ul jika Anda secara khusus ingin menargetkan ul terluar:

<ul class="rootlist">
...

Maka itu:

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

Cara lain untuk memastikan Anda hanya memiliki elemen root li:

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

Kelihatannya kludgy, tapi seharusnya berhasil


Hmm Saya menemukan masalah saya adalah dengan menggunakan jquery 1.2. Saya telah menggantinya dengan 1.3 dan selektor semacam ini berfungsi dengan baik sekarang. Terima kasih banyak atas balasan Anda dan semua orang yang membalas.
aston

Jika Anda tidak ingin menambahkan kelas, cukup lakukan $ ("ul: first> li a") jelas ini hanya akan berfungsi untuk level pertama, bukan level dalam.
Alfonso

Terima kasih atas tip Anda. Saya telah menguji ini juga, dan tampaknya berfungsi dengan baik: ul.find(">li");jika Anda memiliki node "ul" sebagai objek JQuery dalam variabel ul.
John Boe

55

Setelah Anda memiliki ul awal, Anda dapat menggunakan children () , yang hanya akan mempertimbangkan turunan langsung dari elemen tersebut. Seperti yang ditunjukkan @activa, salah satu cara untuk memilih elemen root dengan mudah adalah dengan memberinya kelas atau id. Berikut ini mengasumsikan Anda memiliki ul root dengan id root.

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

2
Terima kasih, Ini sangat membantu saya. Sebuah $('ul').first().children('li')juga dapat digunakan
Ivan Black

Ini adalah jawaban yang saya sukai, karena saya sudah memiliki elemen dan akan menggunakan .children daripada .find.
Herbert Van-Vliet

7

Seperti yang dinyatakan dalam jawaban lain, metode paling sederhana adalah dengan mengidentifikasi elemen root secara unik (menurut ID atau nama kelas) dan menggunakan pemilih keturunan langsung.

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

Namun, saya menemukan pertanyaan ini untuk mencari solusi yang akan bekerja pada elemen yang tidak disebutkan namanya di berbagai kedalaman DOM.

Ini dapat dicapai dengan memeriksa setiap elemen, dan memastikannya tidak memiliki induk dalam daftar elemen yang cocok. Inilah solusi saya , dibungkus dengan 'paling atas' pemilih 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;
  }
});

Memanfaatkan ini, solusi untuk posting asli adalah:

$('ul:topmost > li > a')

// Or, more simply:
$('li:topmost > a')

JsFiddle lengkap tersedia di sini .


Dengan menggunakan metode DOM baru Anda dapat secara dramatis meningkatkan kinerja :topmost- coba gunakan .parentElement.closest(selector). Seperti biasa, IE + Edge adalah satu-satunya yang tidak mendukungnya> :-( jadi inilah polyfill pastebin.com/JNBk77Vm
oriadam


3

Anda mungkin ingin mencoba ini jika hasil masih mengalir ke turunan, dalam banyak kasus JQuery masih berlaku untuk turunan.

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

Menggunakan metode ini: E> F Mencocokkan semua elemen F yang merupakan turunan dari elemen E.

Memberi tahu JQuery untuk hanya mencari turunan eksplisit. http://www.w3.org/TR/CSS2/selector.html


0

Anda juga dapat menggunakan $("ul li:first-child")untuk hanya mendapatkan anak langsung dari UL.

Saya setuju, Anda memerlukan ID atau sesuatu yang lain untuk mengidentifikasi UL utama jika tidak maka hanya akan memilih semuanya. Jika Anda memiliki div dengan ID di sekitar UL, hal termudah untuk dilakukan adalah$("#someDiv > ul > li")


3
Ini adalah penggunaan yang salah :first-child. Ini akan memilih "yang pertama lidari setiap ul". Posting asli meminta "setiap lidari yang pertama ul."
Courtney Christensen


0

Saya mengalami masalah dengan kelas bersarang dari kedalaman apa pun jadi saya menemukan ini. Ini akan memilih hanya level pertama yang ditemuinya dari Objek Jquery yang mengandung:

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)

mungkin ada banyak cara lain


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

.form-item kedua pada anak tingkat pohon dari .add_to_cart


1
Ini bahkan tidak masuk akal untuk pertanyaan itu
renke

>>> Apa itu? Apakah pemilih ini punya nama? Apakah itu pemilih yang valid? Atau apakah itu lelucon?
John Boe
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.