Compter les éléments div enfants immédiats à l'aide de jQuery


183

J'ai la structure de nœud HTML suivante:

<div id="foo">
  <div id="bar"></div>
  <div id="baz">
    <div id="biz"></div>
  </div>
  <span></span>
</div>

Comment compter le nombre d'enfants immédiats de foo, qui sont de type div? Dans l'exemple ci-dessus, le résultat doit être deux ( baret baz).


1
J'ai ajouté un test jsperf pour voir la différence de vitesse entre les différentes approches. voir ma réponse ci
manikanta

Réponses:


350
$("#foo > div").length

Direct les enfants de l'élément avec l'id 'foo' qui sont des divs Récupérer ensuite la taille de l'ensemble enveloppé produit.


1
Je me demandais juste vendredi comment compter les colonnes de table avec jQuery. Je vais devoir essayer une approche similaire: $('#table > th').size().
Jim Schubert

1
Parfois, cela ne fonctionne pas et vous devez utiliser $ ('# foo'). Children (). Size () qui est de toute façon plus rapide selon @mrCoder
472084

Si je veux utiliser ceci au lieu de #foo alors, comment l'utiliser?
Mukesh

@ 472084 Si vous le faites de cette façon, il compterait également l'élément "span". Remarquez comment la question spécifie qu'il veut compter uniquement les éléments "div", pas tous les éléments.
Angel Blanco

68

Je recommande d'utiliser $('#foo').children().size()pour de meilleures performances.

J'ai créé un test jsperf pour voir la différence de vitesse et la children()méthode a battu l'approche du sélecteur enfant (#foo> div) d'au moins 60% dans Chrome (version canary v15) 20-30% dans Firefox (v4).

En passant, il va sans dire que ces deux approches produisent les mêmes résultats (dans ce cas, 1000).

[Mise à jour] J'ai mis à jour le test pour inclure le test size () vs length, et cela ne fait pas beaucoup de différence (résultat: l' lengthutilisation est légèrement plus rapide (2%) que size())

[Mise à jour] En raison du balisage incorrect vu dans l'OP (avant « balisage Validé » mise à jour par moi), à la fois $("#foo > div").lengthet $('#foo').children().lengthdonné le même ( jsFiddle ). Mais pour que la réponse correcte n'obtienne QUE des enfants `` div '', on DEVRAIT utiliser le sélecteur d'enfants pour des performances correctes et meilleures


bien que cette question soit posée il y a quelque temps, je voulais juste partager pour que cela puisse aider quelqu'un à partir de maintenant
manikanta

Où est filtrer uniquement les enfants «div» là-bas?
Andrey Tserkus

2
.lengthest en fait la méthode préférée car elle n'a pas la surcharge d'un appel de fonction.
Nic Aitch

Oui, le sélecteur enfant est correct car il utilise des sélecteurs CSS natifs, donc la sélection est écrite en C ++ plutôt qu'en JavaScript ... Une différence de performances. Cette réponse est plus facile à comprendre mais beaucoup plus lente.
mdenton8

@manikanta Hey, réponse très détaillée. Désolé de déranger, une question. Si j'aime $('#extraLinks').children().size()compter les zones de texte dans un div (nommé extraLinks) pourquoi j'obtiens 4quand elles ne sont que 2. En général, j'obtiens la longueur multipliée par 2 ... Une idée pourquoi? Merci
slevin

25
$("#foo > div") 

sélectionne tous les div qui sont des descendants immédiats de #foo
une fois que vous avez l'ensemble des enfants, vous pouvez soit utiliser la fonction de taille:

$("#foo > div").size()

ou vous pouvez utiliser

$("#foo > div").length

Les deux vous renverront le même résultat



8

En réponse à la réponse de mrCoders en utilisant jsperf, pourquoi ne pas simplement utiliser le nœud dom?

var $foo = $('#foo');
var count = $foo[0].childElementCount

Vous pouvez essayer le test ici: http://jsperf.com/jquery-child-ele-size/7

Cette méthode obtient 46095 op / s tandis que les autres méthodes au mieux 2000 op / s


2
L'OP a demandé uniquement les éléments enfants div
dj18



5
var divss = 0;
$(function(){
   $("#foo div").each(function(){
    divss++;

   });
   console.log(divss);  
});     
<div id="foo">
  <div id="bar" class="1"></div>
  <div id="baz" class="1"></div>
  <div id="bam" class="1"></div>
</div>

3

Avec la version la plus récente de jquery, vous pouvez utiliser $("#superpics div").children().length.


2
var n_numTabs = $("#superpics div").size();

ou

var n_numTabs = $("#superpics div").length;

Comme cela a déjà été dit, les deux renvoient le même résultat.
Mais la fonction size () est plus jQuery "PC".
J'ai eu un problème similaire avec ma page.
Pour l'instant, omettez simplement le> et cela devrait fonctionner correctement.


Le sélecteur de descendant retournera tous les descendants de #superpics, y compris l'enfant, le petit-enfant, l'arrière-petit-enfant, etc., de cet élément, pas seulement les enfants immédiats
manikanta

plus jQuery "PC". veux dire ?
Ghanshyam Lakhani


-1

Essayez ceci pour les éléments enfants immédiats de type div

$("#foo > div")[0].children.length
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.