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

Dónal
la source
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.

Garry Shutler
la source
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

Manikanta
la source
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

Darko Z
la source
17
$('#foo').children('div').length
Abdennour TOUMI
la source
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

HaxElit
la source
2
L'OP a demandé uniquement les éléments enfants div
dj18
6
$('#foo > div').size()
gadget
la source
5
$("#foo > div").length

jQuery a une fonction .size () qui retournera le nombre de fois où un élément apparaît mais, comme spécifié dans la documentation jQuery, il est plus lent et renvoie la même valeur que la propriété .length, il est donc préférable d'utiliser simplement le. propriété de longueur. De là: http://www.electrictoolbox.com/get-total-number-matched-elements-jquery/

zholdas
la source
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>
John Alvarez
la source
3

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

Kent Thomas
la source
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.

Andrew Perkins
la source
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
$("div", "#superpics").size();
Alexandros Ioannou
la source
1
Cela compte tous les div descendants, pas seulement les enfants.
Felix Kling
-1

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

$("#foo > div")[0].children.length
talent makhanya
la source