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


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.


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


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



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


2
El OP solicitó solo elementos secundarios 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

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


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.


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

Pruebe esto para elementos secundarios inmediatos de tipo div

$("#foo > div")[0].children.length
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.