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

Dónal
fonte
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.

Garry Shutler
fonte
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

manikanta
fonte
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

Darko Z
fonte
17
$('#foo').children('div').length
Abdennour TOUMI
fonte
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

HaxElit
fonte
2
O OP pediu para elementos filho única div
dj18
6
$('#foo > div').size()
aparelho
fonte
5
$("#foo > div").length

O jQuery possui uma função .size () que retornará o número de vezes que um elemento aparece, mas, conforme especificado na documentação do jQuery, é mais lento e retorna o mesmo valor que a propriedade .length, portanto é melhor simplesmente usar o. propriedade length. A partir daqui: http://www.electrictoolbox.com/get-total-number-matched-elements-jquery/

zholdas
fonte
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>
John Alvarez
fonte
3

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

Kent Thomas
fonte
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.

Andrew Perkins
fonte
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
$("div", "#superpics").size();
Alexandros Ioannou
fonte
1
Isso conta todos os div descendentes, não apenas os filhos.
Felix Kling
-1

Tente isso para elementos filho imediatos do tipo div

$("#foo > div")[0].children.length
talento makhanya
fonte