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.