99 votes

Sélectionner uniquement les éléments de premier niveau dans jquery

Comment puis-je sélectionner les éléments de lien du parent uniquement ? <ul> d'une liste comme celle-ci ?

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

Donc, en css ul li a mais pas ul li ul li a

Merci

109voto

Philippe Leybaert Points 62715
$("ul > li a")

Mais vous devez définir une classe sur l'ul racine si vous voulez cibler spécifiquement l'ul le plus extérieur :

<ul class="rootlist">
...

Alors c'est :

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

Une autre façon de s'assurer que vous n'avez que les éléments Root li :

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

Ça a l'air bizarre, mais ça devrait faire l'affaire.

0 votes

Hmm j'ai découvert que mon problème venait de l'utilisation de jquery 1.2. Je l'ai remplacé par la version 1.3 et ce type de sélecteurs fonctionne bien maintenant. Merci beaucoup pour votre réponse et à tous ceux qui ont répondu.

0 votes

Si vous ne voulez pas ajouter de classe, faites simplement $("ul:first > li a"). Bien entendu, cela ne fonctionnera que pour le premier niveau, pas pour les niveaux intérieurs.

1 votes

Merci pour votre conseil. Je l'ai également testé, et il semble que cela fonctionne bien : ul.find(">li"); si vous avez le noeud "ul" comme objet JQuery dans la variable ul.

61voto

tvanfosson Points 268301

Une fois que vous avez le ul initial, vous pouvez utiliser l'outil enfants() qui ne prendra en compte que les enfants immédiats de l'élément. Comme le souligne @activa, une façon de sélectionner facilement l'élément Root est de lui donner une classe ou un id. Ce qui suit suppose que vous avez un élément Root ul avec id root .

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

2 votes

Merci, c'est très utile pour moi. An $('ul').first().children('li') peut également être utilisé

0 votes

C'est la solution que je préfère, car je dispose déjà de l'élément et j'utiliserai donc .children au lieu de .find.

7voto

zourtney Points 4501

Comme indiqué dans d'autres réponses, la méthode la plus simple consiste à identifier de manière unique l'élément Root (par son ID ou le nom de sa classe) et à utiliser le sélecteur direct descendant.

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

Cependant, je suis tombé sur cette question en cherchant une solution qui fonctionnerait sur les sites suivants éléments sans nom à l'adresse profondeurs variables du DOM.

Pour ce faire, il faut vérifier chaque élément et s'assurer qu'il n'a pas de parent dans la liste des éléments correspondants. Voici mon solution enveloppé dans un sélecteur 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;
  }
});

En utilisant ceci, la solution au message original est :

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

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

jsFiddle complet disponible aquí .

0 votes

En utilisant les nouvelles méthodes DOM, vous pouvez améliorer considérablement les performances de l'application. :topmost - essayez d'utiliser .parentElement.closest(selector) . Comme toujours, IE+Edge sont les seuls à ne pas le supporter >:-( voici donc un polyfill pastebin.com/JNBk77Vm

3voto

TitanKing Points 11

Vous pouvez essayer de le faire si les résultats s'appliquent toujours aux enfants. Dans de nombreux cas, JQuery s'applique toujours aux enfants.

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

En utilisant cette méthode : E > F Correspond à tout élément F qui est un enfant d'un élément E.

Indique à JQuery de rechercher uniquement les enfants explicites. http://www.w3.org/TR/CSS2/selector.html

0voto

Chris Barr Points 3568

Vous pouvez également utiliser $("ul li:first-child") pour obtenir uniquement les enfants directs de l'UL.

Je suis d'accord cependant, vous avez besoin d'un ID ou quelque chose d'autre pour identifier l'UL principal, sinon il va simplement les sélectionner tous. Si vous aviez un div avec un ID autour de l'UL, la chose la plus simple à faire serait de $("#someDiv > ul > li")

4 votes

Il s'agit d'une utilisation incorrecte de :first-child . Cela permettra de sélectionner le "premier li de chaque ul ". Le message original demandait que "chaque li du premier ul ."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X