JQuery kullanarak hemen alt div öğelerini sayma


180

Aşağıdaki HTML düğümü yapısı var:

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

fooBu türden olan yakın çocukların sayısını nasıl hesaplayabilirim div? Yukarıdaki örnekte, sonuç iki ( barve baz) olmalıdır.


1
Farklı yaklaşımlar arasındaki hız farkını görmek için bir jsperf testi ekledim. aşağıdaki cevabımı gör
manikanta

Yanıtlar:


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

Div 'olan' foo 'kimliğine sahip öğenin doğrudan alt öğeleri. Daha sonra üretilen sargılı setin boyutunu almak.


1
Sadece Cuma günü jQuery ile tablo sütunları saymak nasıl merak ediyordum. Ben de benzer bir yaklaşım gerekecek: $('#table > th').size().
Jim Schubert

1
Bazen bu işi yapmaz ve $ ( '# foo') kullanmak zorunda çocuklar () @mrCoder göre zaten hızlıdır boyutu ()..
472084

Bunu #foo yerine kullanmak istersem, nasıl kullanılır?
Mukesh

@ 472084 Bunu bu şekilde yaparsanız, "span" öğesini de sayar. Sorunun, tüm öğeleri değil, yalnızca "div" öğelerini saymak istediğini nasıl belirttiğine dikkat edin.
Angel Blanco

68

Kullanmanızı öneririm $('#foo').children().size() iyi performans için .

Ben oluşturduk jsperf hız farkını görmek için testi children()en azından tarafından çocuk seçici dayak yöntemi (#foo> div) yaklaşımını % 60 Chrome'da (kanarya inşa v15) 20-30% Firefox'ta (v4) .

Bu arada, söylemeye gerek yok, bu iki yaklaşım aynı sonuçları üretir (bu durumda, 1000).

[Güncelleme] Boyutu () ve uzunluk testini içerecek şekilde testi güncelledim ve çok fazla fark yaratmıyorlar (sonuç: lengthkullanım biraz daha hızlı (% 2) size())

[Güncelleme] nedeniyle OP görülen yanlış biçimlendirme için (bana göre 'biçimlendirme Validated' güncelleme öncesi), hem $("#foo > div").length& $('#foo').children().lengthaynı (sonuçlanmıştır jsfiddle ). Ancak SADECE 'div' çocukları elde etmek için doğru cevap için, doğru ve daha iyi performans için çocuk seçiciyi KULLANMALIDIR


Bu soru bir süre önce
sorulsa da

Sadece 'div' çocukları filtrelemek nerede?
Andrey Tserkus

2
.lengthaslında bir işlev çağrısının ek yükü olmadığından tercih edilen yöntemdir.
Nic Aitch

Evet, alt seçici doğru çünkü yerel CSS seçicileri kullanıyor, bu yüzden seçim JavaScript yerine C ++ ile yazılmış ... Oldukça performans farkı. Bu cevabı anlamak daha kolay ama çok daha yavaş.
mdenton8

@manikanta Hey, çok detaylı cevap. Rahatsız ettiğim için üzgünüm, bir soru. $('#extraLinks').children().size()Bir div (ekstraLinks adlı) metin kutuları saymak isterseniz ben neden 4sadece 2 olduğunda olsun . Genel olarak, uzunluğu 2 ile çarpılır olsun ... Neden herhangi bir fikir? Teşekkürler
slevin

25
$("#foo > div") 

#foo öğesinin hemen torunları olan tüm div'leri seçer
, çocuk setiniz varsa size boyut işlevini kullanabilirsiniz:

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

ya da kullanabilirsiniz

$("#foo > div").length

Her ikisi de size aynı sonucu döndürür



8

MrCoders jsperf kullanarak yanıt olarak neden sadece dom düğümü kullanmıyorsunuz?

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

Testi burada deneyebilirsiniz: http://jsperf.com/jquery-child-ele-size/7

Bu yöntem 46.095 op / s alırken, diğer yöntemler en iyi 2000 op / s alır


2
OP sadece div alt öğeleri istedi
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

Jquery'nin en son sürümü ile kullanabilirsiniz $("#superpics div").children().length.


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

veya

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

Daha önce de söylendiği gibi, her ikisi de aynı sonucu verir.
Ancak size () işlevi daha fazla jQuery "PC" dir.
Sayfamla benzer bir sorun yaşadım.
Şimdilik,> işaretini atlayın ve iyi çalışmalıdır.


Descendant Selector, #superpics'in tüm torunları, çocuk, torun, büyük torun vb. Dahil olmak üzere, bu öğenin sadece hemen çocukları değil, tüm torunlarını döndürür
manikanta

daha fazla jQuery "PC". anlamına geliyor ?
Ghanshyam Lakhani


-1

Div türündeki hemen alt öğeler için bunu deneyin

$("#foo > div")[0].children.length
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.