ฉันเป็นมือใหม่ jQuery และในขณะที่ดูตัวอย่างโค้ดฉันพบ:
$(document.body)
และ $('body')
มีความแตกต่างระหว่างสองสิ่งนี้หรือไม่?
$(body)
ไม่ทำงานสำหรับ.on('click'...
เหตุการณ์ที่เกิดขึ้นในขณะที่$(document.body)
และ$(document)
การทำงานของทั้งสอง
ฉันเป็นมือใหม่ jQuery และในขณะที่ดูตัวอย่างโค้ดฉันพบ:
$(document.body)
และ $('body')
มีความแตกต่างระหว่างสองสิ่งนี้หรือไม่?
$(body)
ไม่ทำงานสำหรับ.on('click'...
เหตุการณ์ที่เกิดขึ้นในขณะที่$(document.body)
และ$(document)
การทำงานของทั้งสอง
คำตอบ:
พวกเขาอ้างถึงองค์ประกอบเดียวกันความแตกต่างคือเมื่อคุณบอกว่าdocument.body
คุณส่งผ่านองค์ประกอบไปยัง jQuery โดยตรง หรืออีกวิธีหนึ่งคือเมื่อคุณส่งสตริงเอ็น'body'
จินตัวเลือก jQueryจะต้องตีความสตริงเพื่อดูว่ามันอ้างถึงองค์ประกอบใด
ในทางปฏิบัติจะได้งานทำ
หากคุณมีความสนใจมีข้อมูลเพิ่มเติมในเอกสารสำหรับฟังก์ชั่น jQuery
คำตอบที่นี่ไม่ได้เป็นจริงอย่างสมบูรณ์ถูกต้อง ปิด แต่มีขอบกรณี
ความแตกต่างคือ $ ('body') เลือกองค์ประกอบตามชื่อแท็กในขณะที่ document.body อ้างถึงวัตถุโดยตรงบนเอกสาร
นั่นหมายความว่าหากคุณ (หรือสคริปต์โกง) เขียนทับองค์ประกอบ document.body (ความอัปยศ!) $ ('body') จะยังใช้งานได้ แต่ $ (document.body) จะไม่ทำงาน ตามความหมายแล้วมันไม่เทียบเท่า
ฉันกล้าที่จะเดาว่ามีกรณีขอบอื่น ๆ (เช่นองค์ประกอบที่ไม่ได้ใช้งานทั่วโลกใน IE) ที่จะทริกเกอร์จำนวนเงินให้กับองค์ประกอบเนื้อหาที่เขียนทับบนวัตถุเอกสารและจะใช้สถานการณ์เดียวกัน
ฉันพบความแตกต่างอย่างมากในเรื่องเวลาเมื่อทดสอบในเบราว์เซอร์ของฉัน
ฉันใช้สคริปต์ต่อไปนี้:
คำเตือน: การเรียกใช้สิ่งนี้จะทำให้เบราว์เซอร์ของคุณหยุดทำงานเล็กน้อยและอาจทำให้เกิดความผิดพลาด
var n = 10000000, i;
i = n;
console.time('selector');
while (i --> 0){
$("body");
}
console.timeEnd('selector');
i = n;
console.time('element');
while (i --> 0){
$(document.body);
}
console.timeEnd('element');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
ฉันมีการโต้ตอบ 10 ล้านครั้งและนั่นคือผลลัพธ์ (Chrome 65):
ตัวเลือก: 19591.97509765625ms
องค์ประกอบ: 4947.8759765625ms
การส่งผ่านองค์ประกอบโดยตรงจะเร็วกว่าการผ่านตัวเลือกประมาณ 4 เท่า
$(document.body)
กำลังใช้การอ้างอิงส่วนกลางdocument
เพื่อรับการอ้างอิงถึงในbody
ขณะที่$('body')
ตัวเลือกที่ jQuery จะได้รับการอ้างอิงถึง<body>
องค์ประกอบบนไฟล์document
.
ไม่มีความแตกต่างที่สำคัญที่ฉันเห็นไม่ใช่ประสิทธิภาพที่เพิ่มขึ้นอย่างเห็นได้ชัดจากอีกด้านหนึ่ง
$(document.body)
จะเร็วขึ้นอย่างวัดผลได้จากบทความนี้: sitepoint.com/jquery-body-on-document-on
ไม่ควรมีความแตกต่างเลยบางทีคนแรกอาจจะเป็นนักแสดงมากกว่าเล็กน้อย แต่ฉันคิดว่ามันเป็นเรื่องเล็กน้อย (คุณไม่ควรกังวลเรื่องนี้จริงๆ)
ด้วยทั้งคุณห่อ<body>
แท็กในวัตถุ jQuery
เอาท์พุททั้งสองเทียบเท่ากัน แม้ว่านิพจน์ที่สองจะผ่านการค้นหาจากบนลงล่างจากรูท DOM คุณอาจต้องการหลีกเลี่ยงค่าใช้จ่ายเพิ่มเติม (อย่างไรก็ตามอาจมีขนาดเล็กที่สุด) หากคุณมีวัตถุ document.body อยู่แล้วเพื่อให้ JQuery ปิดทับ โปรดดูที่http://api.jquery.com/jQuery/ #Selector Context