Contare gli elementi div figlio immediati utilizzando jQuery


180

Ho la seguente struttura di nodi HTML:

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

Come posso contare il numero di figli immediati di foo, che sono di tipo div? Nell'esempio sopra, il risultato dovrebbe essere due ( bare baz).


1
Ho aggiunto un test jsperf per vedere la differenza di velocità tra diversi approcci. vedi la mia risposta qui sotto
manikanta

Risposte:


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

Dirigi i figli dell'elemento con l'id 'pippo' che sono div. Quindi recuperare le dimensioni del set avvolto prodotto.


1
Venerdì mi stavo chiedendo come contare le colonne della tabella con jQuery. Dovrò provare un approccio simile: $('#table > th').size().
Jim Schubert,

1
A volte questo non funziona e devi usare $ ('# foo'). Children (). Size () che è comunque più veloce secondo @mrCoder
472084

Se voglio usare questo invece di #foo, allora. Come usare questo?
Mukesh,

@ 472084 Se lo fai in questo modo, conterrebbe anche l'elemento "span". Nota come la domanda specifica che vuole contare solo gli elementi "div", non tutti gli elementi.
Angel Blanco,

68

Raccomando di usare $('#foo').children().size() per prestazioni migliori.

Ho creato un test jsperf per vedere la differenza di velocità e il children()metodo ha battuto l'approccio selettore figlio (#foo> div) di almeno il 60% in Chrome (canary build v15) 20-30% in Firefox (v4).

A proposito, inutile dirlo, questi due approcci producono gli stessi risultati (in questo caso, 1000).

[Aggiornamento] Ho aggiornato il test per includere il test size () vs lunghezza e non fanno molta differenza (risultato: l' lengthutilizzo è leggermente più veloce (2%) rispetto a size())

[Aggiornamento] A causa del markup errato visto nell'OP (prima dell'aggiornamento 'markup validated' da parte mia), entrambi $("#foo > div").lengthe $('#foo').children().lengthlo stesso risultato ( jsfiddle ). Ma per una risposta corretta per ottenere SOLO bambini "div", un DOVREBBE utilizzare il selettore figlio per prestazioni corrette e migliori


anche se questa domanda viene posta qualche tempo fa, volevo solo condividere in modo che questo potesse aiutare qualcuno da ora
manikanta

Dove sta filtrando solo i bambini "div" lì?
Andrey Tserkus,

2
.lengthè infatti il ​​metodo preferito perché non ha l'overhead di una chiamata di funzione.
Nic Aitch,

Sì, il selettore figlio è corretto perché utilizza selettori CSS nativi, quindi la selezione è scritta in C ++ anziché JavaScript ... Una differenza di prestazioni piuttosto elevata. Questa risposta è più facile da capire ma molto più lenta.
mdenton8,

@manikanta Ehi, risposta molto dettagliata. Mi dispiace disturbarla, una domanda. Se mi piace $('#extraLinks').children().size()contare le caselle di testo in un div (chiamato extraLinks) perché ottengo 4quando sono solo 2. In generale, ottengo la lunghezza moltiplicata per 2 ... Qualche idea sul perché? Grazie
slevin,

25
$("#foo > div") 

seleziona tutti i div che sono discendenti immediati di #foo
una volta che hai il set di figli puoi usare la funzione size:

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

oppure puoi usare

$("#foo > div").length

Entrambi ti restituiranno lo stesso risultato



8

In risposta a mrCoders rispondi usando jsperf perché non usare semplicemente il nodo dom?

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

Puoi provare il test qui: http://jsperf.com/jquery-child-ele-size/7

Questo metodo ottiene 46.095 op / s mentre gli altri metodi nella migliore delle ipotesi 2000 op / s


2
Il PO ha chiesto solo elementi figlio 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 versione più recente di jquery, è possibile utilizzare $("#superpics div").children().length.


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

o

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

Come già detto, entrambi restituiscono lo stesso risultato.
Ma la funzione size () è più "PC" jQuery.
Ho avuto un problema simile con la mia pagina.
Per ora, basta omettere il> e dovrebbe funzionare bene.


Il Discendente Selettore restituirà tutti i discendenti di #superpics, inclusi figlio, nipote, pronipote e così via, di quell'elemento, non solo figli immediati
manikanta

più jQuery "PC". si intende ?
Ghanshyam Lakhani,


-1

Prova questo per elementi figlio immediati di tipo div

$("#foo > div")[0].children.length
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.