นับองค์ประกอบลูกรองทันทีโดยใช้ jQuery


180

ฉันมีโครงสร้างโหนด HTML ต่อไปนี้:

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

ฉันจะนับจำนวนเด็กfooที่อยู่ในประเภทนั้นได้divอย่างไร ในตัวอย่างด้านบนผลลัพธ์ควรเป็นสอง ( barและbaz)


1
ฉันได้เพิ่มการทดสอบ jsperf เพื่อดูความแตกต่างของความเร็วระหว่างแนวทางที่ต่างกัน ดูคำตอบของฉันด้านล่าง
manikanta

คำตอบ:


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

แนะนำเด็ก ๆ ขององค์ประกอบด้วย id 'foo' ซึ่งเป็น divs จากนั้นเรียกขนาดของชุดที่ผลิตออกมา


1
ฉันแค่สงสัยในวันศุกร์ที่วิธีการนับคอลัมน์ตารางด้วย jQuery ฉันจะต้องลองวิธีที่คล้ายกัน: $('#table > th').size().
Jim Schubert

1
บางครั้งสิ่งนี้ไม่ทำงานและคุณต้องใช้ $ ('# foo'). children (). size () ซึ่งเร็วกว่าอย่างไรก็ตามตาม @mrCoder
472084

ถ้าฉันต้องการใช้สิ่งนี้แทน #foo คุณจะใช้มันอย่างไร
Mukesh

@ 472084 ถ้าคุณทำอย่างนั้นมันจะนับองค์ประกอบ "span" ด้วย สังเกตว่าคำถามนั้นระบุว่าเขาต้องการนับเฉพาะองค์ประกอบ "div" ไม่ใช่องค์ประกอบทั้งหมด
Angel Blanco

68

ฉันแนะนำให้ใช้$('#foo').children().size()เพื่อประสิทธิภาพที่ดีขึ้น

ฉันได้สร้างการทดสอบjsperfเพื่อดูความแตกต่างความเร็วและchildren()วิธีการเอาชนะตัวเลือกลูก (#foo> div) วิธีการอย่างน้อย60%ใน Chrome (นกขมิ้นสร้าง v15) 20-30%ใน Firefox (v4)

โดยวิธีการที่จำเป็นต้องพูดสองวิธีนี้ให้ผลลัพธ์ที่เหมือนกัน (ในกรณีนี้คือ 1,000)

[อัปเดต] ฉันได้อัปเดตการทดสอบเพื่อรวมขนาด () และการทดสอบความยาวแล้วและพวกเขาก็ไม่ได้สร้างความแตกต่างมากนัก (ผล: lengthการใช้งานเร็วกว่า (2%) เล็กน้อยsize())

[อัปเดต] เนื่องจากมาร์กอัปที่ไม่ถูกต้องที่เห็นใน OP (ก่อนที่จะอัปเดต 'ฉันตรวจสอบความถูกต้องของมาร์กอัป' โดยฉัน) ทั้งสอง$("#foo > div").length& $('#foo').children().lengthส่งผลเหมือนกัน ( jsfiddle ) แต่สำหรับคำตอบที่ถูกต้องเพื่อให้ได้ลูก 'div' เท่านั้นควรใช้ตัวเลือกลูกเพื่อให้ได้ประสิทธิภาพที่ดีขึ้น


แม้ว่าคำถามนี้ถูกถามในบางช่วงเวลาเพียงต้องการแบ่งปันเพื่อที่จะสามารถช่วยใครบางคนจากตอนนี้
manikanta

มีการกรองเฉพาะเด็ก 'div' อยู่ที่นั่นหรือไม่
Andrey Tserkus

2
.lengthในความเป็นจริงเป็นวิธีที่ต้องการเพราะไม่มีค่าใช้จ่ายในการเรียกใช้ฟังก์ชัน
Nic Aitch

ใช่แล้วตัวเลือกลูก ๆ นั้นถูกต้องเพราะใช้ตัวเลือก CSS ดั้งเดิมดังนั้นการเลือกจะถูกเขียนใน C ++ แทน JavaScript ... ค่อนข้างแตกต่างของประสิทธิภาพ คำตอบนี้ง่ายต่อการเข้าใจ แต่ช้ากว่ามาก
mdenton8

@manikanta เฮ้ผู้ช่วยที่มีรายละเอียดมาก ขออภัยที่ต้องกังวลหนึ่งคำถาม หากฉันต้องการ$('#extraLinks').children().size()นับกล่องข้อความใน div (ชื่อ extraLinks) ทำไมฉันถึงได้4เมื่อพวกเขามีเพียง 2 โดยทั่วไปฉันได้รับความยาวคูณด้วย 2 ... ความคิดใดทำไม ขอบคุณ
slevin

25
$("#foo > div") 

เลือก div ทั้งหมดที่เป็นทายาทของ #foo
ทันทีที่คุณมีชุดลูกคุณสามารถใช้ฟังก์ชันขนาดได้:

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

หรือคุณสามารถใช้

$("#foo > div").length

ทั้งสองอย่างจะให้ผลลัพธ์ที่เหมือนกันแก่คุณ



8

ในการตอบสนองต่อ mrCoders ตอบโดยใช้ jsperf ทำไมไม่เพียงใช้โหนด dom?

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

คุณสามารถลองทดสอบได้ที่นี่: http://jsperf.com/jquery-child-ele-size/7

วิธีนี้ได้ 46,095 op / s ในขณะที่วิธีอื่นที่ดีที่สุด 2000 op / s


2
OP ขอเฉพาะองค์ประกอบย่อย div
dj18


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

jQuery มีฟังก์ชั่น. size () ซึ่งจะคืนค่าจำนวนครั้งที่องค์ประกอบปรากฏ แต่ตามที่ระบุไว้ในเอกสารประกอบ jQuery มันจะช้าลงและส่งกลับค่าเดียวกันกับคุณสมบัติความยาวดังนั้นจึงควรใช้ คุณสมบัติความยาว จากที่นี่: http://www.electrictoolbox.com/get-total-number-matched-elements-jquery/


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>


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

หรือ

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

อย่างที่พูดไปแล้วทั้งคู่ก็กลับผลลัพธ์เหมือนเดิม
แต่ฟังก์ชั่นขนาด () เป็น jQuery "PC" มากกว่า
ฉันมีปัญหาคล้ายกันกับหน้าของฉัน
ในตอนนี้เพียงแค่ละเว้น> และควรจะทำงานได้ดี


ตัวเลือกผู้สืบทอดจะส่งคืนลูกหลานทั้งหมดของ #superpics รวมถึง child, grandchild, great-grandchild และอื่น ๆ ขององค์ประกอบนั้นไม่ใช่เพียงแค่เด็ก ๆ ในทันที
manikanta

มากกว่า jQuery "PC" หมายถึงอะไร
Ghanshyam Lakhani


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.