Selezione solo degli elementi di primo livello in jquery


93

Come posso selezionare gli elementi di collegamento del solo genitore <ul>da un elenco come questo?

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

Quindi in CSS ul li a, ma nonul li ul li a

Grazie

Risposte:


108
$("ul > li a")

Ma dovresti impostare una classe sulla radice ul se vuoi specificamente indirizzare l'ul più esterno:

<ul class="rootlist">
...

Quindi è:

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

Un altro modo per assicurarti di avere solo gli elementi li di radice:

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

Sembra kludgy, ma dovrebbe fare il trucco


Hmm ho scoperto che il mio problema era con l'utilizzo di jquery 1.2. L'ho sostituito con 1.3 e questo tipo di selettori ora funziona bene. Grazie mille per la tua risposta e per tutti coloro che hanno risposto.
Aston

Nel caso in cui non si desideri aggiungere una classe, basta fare $ ("ul: first> li a") ovviamente questo funzionerebbe solo per il primo livello, non per i livelli interni.
Alfonso

Grazie per il tuo suggerimento. Ho provato anche questo, e sembra che funzioni bene: ul.find(">li");se hai il nodo "ul" come oggetto JQuery nella variabile ul.
John Boe,

55

Una volta ottenuto l'iniziale ul, puoi utilizzare il metodo children () , che considererà solo i figli immediati dell'elemento. Come sottolinea @activa, un modo per selezionare facilmente l'elemento radice è assegnargli una classe o un id. Quanto segue presuppone che tu abbia una root ul con id root.

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

2
Grazie, è molto utile per me. Un $('ul').first().children('li')anche possono essere utilizzati
Ivan Nero

Questa è la risposta preferita per me, poiché ho già l'elemento e quindi userò .children invece di .find.
Herbert Van-Vliet

7

Come affermato in altre risposte, il metodo più semplice è identificare in modo univoco l'elemento radice (tramite ID o nome della classe) e utilizzare il selettore discendente diretto.

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

Tuttavia, mi sono imbattuto in questa domanda alla ricerca di una soluzione che funzionasse su elementi senza nome a diverse profondità del DOM.

Ciò può essere ottenuto controllando ogni elemento e assicurandosi che non abbia un genitore nell'elenco degli elementi corrispondenti. Ecco la mia soluzione , avvolta in un selettore jQuery "in alto".

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;
  }
});

Utilizzando questo, la soluzione al post originale è:

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

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

JsFiddle completo disponibile qui .


Usando i nuovi metodi DOM puoi migliorare notevolmente le prestazioni di :topmost- prova a usare .parentElement.closest(selector). Come sempre, IE + Edge sono gli unici a non supportarlo> :-( quindi ecco un polyfill pastebin.com/JNBk77Vm
oriadam


3

Potresti provare questo se i risultati continuano a scorrere verso i bambini, in molti casi JQuery si applicherà ancora ai bambini.

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

Utilizzando questo metodo: E> F Corrisponde a qualsiasi elemento F figlio di un elemento E.

Indica a JQuery di cercare solo elementi secondari espliciti. http://www.w3.org/TR/CSS2/selector.html


0

Puoi anche utilizzare $("ul li:first-child")per ottenere solo i figli diretti dell'UL.

Sono d'accordo però, hai bisogno di un ID o qualcos'altro per identificare l'UL principale altrimenti li selezionerà tutti. Se avessi un div con un ID attorno all'UL, la cosa più semplice da fare sarebbe$("#someDiv > ul > li")


3
Questo è un uso errato di :first-child. Questo selezionerà il "primo lidi ogni ul". Il post originale chiedeva "tutti lidal primo ul".
Courtney Christensen


0

Ho avuto qualche problema con le classi nidificate da qualsiasi profondità, quindi l'ho capito. Selezionerà solo il primo livello che incontra di un oggetto Jquery contenente:

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)

ci sono probabilmente molti altri modi


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

il secondo .form-item a livello di albero figlio da .add_to_cart


1
Questo non ha nemmeno senso per la domanda
renke

>>> Che cos'è? Questo selettore ha un nome? È anche un selettore valido? O era uno scherzo?
John Boe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.