Cuente elementos div secundarios inmediatos utilizando jQuery

180

Tengo la siguiente estructura de nodo HTML:

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

¿Cómo cuento el número de hijos inmediatos fooque son de tipo div? En el ejemplo anterior, el resultado debe ser dos ( bary baz).

Dónal
fuente
1
He agregado una prueba jsperf para ver la diferencia de velocidad entre diferentes enfoques. mira mi respuesta a continuación
manikanta

Respuestas:

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

Dirija a los hijos del elemento con el id 'foo' que son divs. Luego recuperando el tamaño del conjunto envuelto producido.

Garry Shutler
fuente
1
El viernes me preguntaba cómo contar las columnas de la tabla con jQuery. Voy a tener que probar un enfoque similar: $('#table > th').size().
Jim Schubert
1
A veces esto no funciona y tienes que usar $ ('# foo'). Children (). Size () que de todos modos es más rápido de acuerdo con @mrCoder
472084
Si quiero usar esto en lugar de #foo, ¿cómo usarlo?
Mukesh
@ 472084 Si lo hace de esa manera, también contaría el elemento "span". Observe cómo la pregunta especifica que quiere contar solo los elementos "div", no todos los elementos.
Angel Blanco
68

Recomiendo usar $('#foo').children().size() para un mejor rendimiento.

Creé una prueba jsperf para ver la diferencia de velocidad y el children()método superó el enfoque del selector secundario (#foo> div) en al menos un 60% en Chrome (canary build v15) 20-30% en Firefox (v4).

Por cierto, no hace falta decir que estos dos enfoques producen los mismos resultados (en este caso, 1000).

[Actualización] He actualizado la prueba para incluir el tamaño () frente a la prueba de longitud, y no hacen mucha diferencia (resultado: el lengthuso es ligeramente más rápido (2%) que size())

[Actualización] Debido al marcado incorrecto visto en el OP (antes de la actualización 'marcado validado' por mí), ambos $("#foo > div").lengthy $('#foo').children().lengthresultaron iguales ( jsfiddle ). Pero para obtener una respuesta correcta para obtener SOLO hijos 'div', uno DEBE usar el selector de niños para un rendimiento correcto y mejor

manikanta
fuente
aunque esta pregunta se hizo en algún momento, solo quería compartir para que esto pueda ayudar a alguien a partir de ahora
manikanta
¿Dónde se filtra allí solo a los niños 'div'?
Andrey Tserkus
2
.lengthDe hecho, es el método preferido porque no tiene la sobrecarga de una llamada de función.
Nic Aitch
Sí, el selector secundario es correcto porque utiliza selectores CSS nativos, por lo que la selección se escribe en C ++ en lugar de JavaScript ... Es una diferencia de rendimiento considerable. Esta respuesta es más fácil de entender pero mucho más lenta.
mdenton8
@manikanta Hola, respuesta muy detallada. Perdón por molestar, una pregunta. Si me gusta $('#extraLinks').children().size()contar cuadros de texto en un div (llamado extraLinks) por qué obtengo 4cuando son solo 2. En general, obtengo la longitud multiplicada por 2 ... ¿Alguna idea de por qué? Gracias
slevin
25
$("#foo > div") 

selecciona todos los divs que son descendientes inmediatos de #foo
una vez que tiene el conjunto de hijos, puede usar la función de tamaño:

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

o puedes usar

$("#foo > div").length

Ambos te devolverán el mismo resultado

Darko Z
fuente
17
$('#foo').children('div').length
Abdennour TOUMI
fuente
8

En respuesta a la respuesta de mrCoders usando jsperf, ¿por qué no solo usar el nodo dom?

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

Puedes probar la prueba aquí: http://jsperf.com/jquery-child-ele-size/7

Este método obtiene 46.095 op / s, mientras que los otros métodos en el mejor de 2000 op / s

HaxElit
fuente
2
El OP solicitó solo elementos secundarios div
dj18
6
$('#foo > div').size()
artilugio
fuente
5
$("#foo > div").length

jQuery tiene una función .size () que devolverá la cantidad de veces que aparece un elemento pero, como se especifica en la documentación de jQuery, es más lento y devuelve el mismo valor que la propiedad .length, por lo que es mejor simplemente usar. Propiedad de longitud. Desde aquí: http://www.electrictoolbox.com/get-total-number-matched-elements-jquery/

zholdas
fuente
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
fuente
3

Con la versión más reciente de jquery, puede usar $("#superpics div").children().length.

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

o

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

Como ya se dijo, ambos devuelven el mismo resultado.
Pero la función size () es más jQuery "PC".
Tuve un problema similar con mi página.
Por ahora, simplemente omita el> y debería funcionar bien.

Andrew Perkins
fuente
Selector de descendiente se devuelve todos los descendientes de #superpics, incluyendo hijo, nieto, bisnieto, y así sucesivamente, de ese elemento, los niños no sólo inmediatos
manikanta
más jQuery "PC". significa?
Ghanshyam Lakhani
1
$("div", "#superpics").size();
Alexandros Ioannou
fuente
1
Eso cuenta todos los div descendientes, no solo los niños.
Felix Kling
-1

Pruebe esto para elementos secundarios inmediatos de tipo div

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