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.