188 votes

Compter les éléments div enfants immédiats en utilisant jQuery

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

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

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

1 votes

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

360voto

Garry Shutler Points 20898
$("#foo > div").length

Enfants directs de l'élément avec l'id 'foo' qui sont des divs. Puis récupération de la taille de l'ensemble enveloppé produit.

1 votes

Je me demandais vendredi comment compter les colonnes d'un tableau avec jQuery. Je vais devoir essayer une approche similaire : $('#table > th').size() .

1 votes

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

0 votes

Si je veux l'utiliser à la place de #foo, comment l'utiliser ?

69voto

manikanta Points 2184

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

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

D'ailleurs, 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 ils ne font pas beaucoup de différence (résultat : length est légèrement plus rapide (2 %) que l'utilisation de size() )

[Mise à jour] En raison d'un balisage incorrect vu dans le PO (avant la mise à jour du 'balisage validé' par moi), les deux $("#foo > div").length & $('#foo').children().length a donné le même résultat ( jsfiddle ). Mais pour obtenir une réponse correcte et obtenir UNIQUEMENT les enfants 'div', il faut utiliser le sélecteur d'enfant pour des performances correctes et meilleures.

0 votes

Bien que cette question ait été posée il y a quelque temps, je voulais juste la partager pour que cela puisse aider quelqu'un à partir de maintenant.

0 votes

Où est le filtrage des seuls enfants "div" ?

2 votes

.length est en fait la méthode préférée car elle n'a pas la surcharge d'un appel de fonction.

26voto

Darko Z Points 16570
$("#foo > div") 

sélectionne tous les divs 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 donneront le même résultat

8voto

HaxElit Points 1353

En réponse à la réponse de mrCoders utilisant jsperf, pourquoi ne pas simplement utiliser le noeud 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 46 095 op/s alors que les autres méthodes obtiennent au mieux 2000 op/s.

2 votes

L'OP a demandé seulement des éléments div child

6voto

gizmo Points 8528
$('#foo > div').size()

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