Contar elementos div filhos imediatos usando jQuery


180

Eu tenho a seguinte estrutura de nó HTML:

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

Como posso contar o número de filhos imediatos de fooque são do tipo div? No exemplo acima, o resultado deve ser dois ( bare baz).


1
Adicionei um teste jsperf para ver a diferença de velocidade entre diferentes abordagens. veja minha resposta abaixo
manikanta

Respostas:


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

Direcione os filhos do elemento com o id 'foo' que são divs. Em seguida, recupere o tamanho do conjunto embrulhado produzido.


1
Eu estava pensando na sexta-feira como contar colunas da tabela com o jQuery. Vou ter que tentar uma abordagem semelhante: $('#table > th').size().
21711 Jim Schubert

1
Às vezes, isso não funciona e você precisa usar $ ('# foo'). Children (). Size (), que é mais rápido de qualquer maneira, de acordo com @mrCoder
472084

Se eu quiser usar isso em vez de #foo então, como usar isso?
Mukesh

@ 472084 Se o fizer dessa forma, também contará o elemento "span". Observe como a pergunta especifica que ele deseja contar apenas os elementos "div", nem todos os elementos.
Anjo Blanco

68

Eu recomendo usar $('#foo').children().size()para um melhor desempenho.

Criei um teste jsperf para ver a diferença de velocidade e o children()método superou a abordagem do seletor filho (#foo> div) em pelo menos 60% no Chrome (canary build v15) 20-30% no Firefox (v4).

A propósito, escusado será dizer que essas duas abordagens produzem os mesmos resultados (neste caso, 1000).

[Atualização] Atualizei o teste para incluir o tamanho () versus o comprimento, e eles não fazem muita diferença (resultado: o lengthuso é um pouco mais rápido (2%) do que size())

[Update] Devido à marcação incorreta visto no OP (antes de 'marcação validado' update por mim), ambos $("#foo > div").length& $('#foo').children().lengthresultou o mesmo ( jsFiddle ). Mas, para uma resposta correta, para obter APENAS filhos 'div', deve-se usar o seletor de filhos para obter o desempenho correto e melhor


embora esta pergunta é feita algum tempo atrás, só queria compartilhar para que isso poderia ajudar alguém a partir de agora
manikanta

Onde está filtrando apenas os filhos 'div' lá?
Andrey Tserkus

2
.lengthé de fato o método preferido porque não possui a sobrecarga de uma chamada de função.
Nic Aitch

Sim, o seletor filho está correto porque usa seletores CSS nativos; portanto, a seleção é escrita em C ++ em vez de JavaScript ... Uma diferença de desempenho. Essa resposta é mais fácil de entender, mas muito mais lenta.
Mdenton8

@manikanta Ei, anser muito detalhado. Desculpe incomodar, uma pergunta. Se eu gosto $('#extraLinks').children().size()de contar caixas de texto em uma div (denominada extraLinks), por que recebo 4quando são apenas 2. Em geral, obtenho o comprimento multiplicado por 2 ... Alguma idéia do porquê? Graças
slevin

25
$("#foo > div") 

seleciona todas as divs que são descendentes imediatos de #foo
depois de ter o conjunto de filhos, você pode usar a função size:

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

ou você pode usar

$("#foo > div").length

Ambos retornarão o mesmo resultado



8

Em resposta à mrCoders, responda usando jsperf, por que não usar apenas o nó dom?

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

Você pode tentar o teste aqui: http://jsperf.com/jquery-child-ele-size/7

Esse método obtém 46.095 op / s, enquanto os outros métodos, no máximo, 2000 op / s


2
O OP pediu para elementos filho única 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

Com a versão mais recente do jquery, você pode usar $("#superpics div").children().length.


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

ou

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

Como já foi dito, ambos retornam o mesmo resultado.
Mas a função size () é mais jQuery "PC".
Eu tive um problema semelhante com a minha página.
Por enquanto, apenas omita o> e deve funcionar bem.


Selector descendente irá retorna todos os descendentes de #superpics, incluindo criança, neto, bisneto, e assim por diante, desse elemento, crianças não apenas imediatas
manikanta

mais jQuery "PC". significa ?
Ghanshyam Lakhani


-1

Tente isso para elementos filho imediatos do tipo div

$("#foo > div")[0].children.length
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.