ในการเลือกโหนดลูกใน jQuery เราสามารถใช้ children () แต่ยังพบ ()
ตัวอย่างเช่น:
$(this).children('.foo');
ให้ผลเหมือนกับ:
$(this).find('.foo');
ตอนนี้ตัวเลือกใดเร็วที่สุดหรือเป็นที่ต้องการและทำไม
find()
เกือบเร็วกว่าเสมอ
ในการเลือกโหนดลูกใน jQuery เราสามารถใช้ children () แต่ยังพบ ()
ตัวอย่างเช่น:
$(this).children('.foo');
ให้ผลเหมือนกับ:
$(this).find('.foo');
ตอนนี้ตัวเลือกใดเร็วที่สุดหรือเป็นที่ต้องการและทำไม
find()
เกือบเร็วกว่าเสมอ
คำตอบ:
children()
ดูที่ชายด์ทันทีของโหนดในขณะที่find()
สำรวจทั้ง DOM ด้านล่างโหนดดังนั้นchildren()
ควรเร็วขึ้นเมื่อมีการใช้งานที่เทียบเท่า อย่างไรก็ตามfind()
ใช้วิธีเบราว์เซอร์ดั้งเดิมในขณะที่children()
ใช้JavaScriptตีความในเบราว์เซอร์ ในการทดลองของฉันมีกรณีทั่วไปไม่แตกต่างกันมาก
สิ่งที่ใช้ขึ้นอยู่กับว่าคุณต้องการพิจารณาเฉพาะผู้สืบทอดโดยตรงหรือโหนดทั้งหมดด้านล่างนี้ใน DOM คือเลือกวิธีที่เหมาะสมตามผลลัพธ์ที่คุณต้องการไม่ใช่ความเร็วของวิธีการนั้น หากประสิทธิภาพเป็นปัญหาอย่างแท้จริงให้ทดลองเพื่อหาทางออกที่ดีที่สุดและใช้วิธีนั้น (หรือดูเกณฑ์มาตรฐานบางอย่างในคำตอบอื่น ๆ ที่นี่)
การทดสอบ jsPerfนี้แสดงให้เห็นว่า find () เร็วขึ้น ฉันสร้างการทดสอบอย่างละเอียดมากขึ้นและมันก็ดูเหมือนว่า find () มีประสิทธิภาพเหนือกว่าเด็ก ๆ ()
อัปเดต:ตามความคิดเห็นของ tvanfosson ฉันสร้างกรณีทดสอบอีกชุดหนึ่งซึ่งมีการทำรัง 16 ระดับ find () ช้าลงเมื่อค้นหา div ที่เป็นไปได้ทั้งหมด แต่ find () ยังดีกว่า children () เมื่อเลือกระดับ div แรก
children () เริ่มมีประสิทธิภาพสูงกว่า find () เมื่อมีการซ้อนมากกว่า 100 ระดับและประมาณ 4,000+ divs สำหรับ find () เพื่อสำรวจ เป็นกรณีทดสอบพื้นฐาน แต่ฉันก็ยังคิดว่า find () เร็วกว่าเด็ก () ในกรณีส่วนใหญ่
ฉันก้าวผ่านรหัส jQuery ในเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ของ Chrome และสังเกตเห็นว่า children () โทรภายในไปยัง sibling (), filter () และผ่าน regexes อีกสองสามกว่า find ()
find () และ children () เติมเต็มความต้องการที่แตกต่างกัน แต่ในกรณีที่ find () และ children () จะแสดงผลลัพธ์เดียวกันฉันขอแนะนำให้ใช้ find ()
นี่คือลิงค์ที่มีการทดสอบประสิทธิภาพที่คุณสามารถเรียกใช้ได้ find()
เป็นจริงประมาณ 2 children()
ครั้งเร็วกว่า
var $test = $list.find('.test');
ที่ $ list เป็นวัตถุ jQuery jsperf.com/jquery-selectors-context/101
สิ่งเหล่านั้นไม่จำเป็นต้องให้ผลลัพธ์เหมือนกัน: find()
จะทำให้คุณได้รับโหนดผู้สืบทอดใด ๆในขณะที่children()
จะทำให้คุณได้รับลูก ๆที่ตรงกันเท่านั้น
จนถึงจุดหนึ่งfind()
ช้ากว่ามากเนื่องจากมันต้องค้นหาโหนดที่สืบทอดทั้งหมดที่อาจเป็นการจับคู่ไม่ใช่เฉพาะลูกที่อยู่ติดกัน อย่างไรก็ตามสิ่งนี้ไม่เป็นความจริงอีกต่อไป find()
เร็วกว่ามากเนื่องจากใช้วิธีเบราว์เซอร์ดั้งเดิม
find()
ในเวลานั้นช้าลงมาก!
ไม่มีคำตอบอื่น ๆ จัดการกับกรณีของการใช้.children()
หรือ.find(">")
จะเพียงค้นหาสำหรับเด็กทันทีขององค์ประกอบผู้ปกครอง ดังนั้นฉันจึงสร้างการทดสอบ jsPerf เพื่อค้นหาโดยใช้วิธีที่แตกต่างกันสามวิธีในการแยกแยะเด็ก ๆ
เมื่อมันเกิดขึ้นแม้เมื่อมีการใช้เป็นพิเศษ ">" เลือกคำ.find()
ยังคงเป็นจำนวนมากได้เร็วกว่า.children()
; ในระบบของฉัน 10x ดังนั้น
ดังนั้นจากมุมมองของฉันดูเหมือนจะไม่มีเหตุผลมากนักที่จะใช้กลไกการกรอง.children()
ทั้งหมด
ทั้งวิธีการ
find()
และchildren()
วิธีใช้ในการกรองลูกขององค์ประกอบที่ตรงกันยกเว้นก่อนหน้านี้คือการเดินทางในระดับใด ๆ ลงหลังคือการเดินทางลงในระดับเดียว
เพื่อทำให้ง่ายขึ้น:
find()
- ค้นหาผ่านองค์ประกอบที่จับคู่ 'ลูกหลานหลานใหญ่ ... ทุกระดับchildren()
- ค้นหาผ่านองค์ประกอบลูกที่ตรงกันเท่านั้น (ระดับเดียวลง)
.find()
และ.children()
ไม่เหมือนกัน สิ่งหลังเท่านั้นที่ผ่านระดับ DOM ลงไปเพียงระดับเดียวเท่านั้นเช่นตัวเลือกลูก