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

aston
sumber

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

Philippe Leybaert
sumber
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');
tvanfosson.dll
sumber
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 .

Courtney Christensen
sumber
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
5

Cukup Anda dapat menggunakan ini ..

$("ul li a").click(function() {
  $(this).parent().find(">ul")...Something;
}

Lihat contoh: https://codepen.io/gmkhussain/pen/XzjgRE

GMK Hussain
sumber
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

TitanKing
sumber
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")

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

Coba ini:

$("#myId > UL > LI")
Lebnik
sumber
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>

Shawn Dotey
sumber
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

Arlan T
sumber
-1
.add_to_cart >>> .form-item:eq(1)

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

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