$ (เอกสาร) .ready (ฟังก์ชัน () {}); vs สคริปต์ที่ด้านล่างของหน้า


คำตอบ:


143

ในตัวของมันเองน้อยมากไม่ว่าจะด้วยวิธีใด DOM จะพร้อมให้คุณใช้งาน (ฉันกังวลเกี่ยวกับเรื่องนี้จนกว่าฉันจะอ่านสิ่งนี้จาก Google ) หากคุณใช้เคล็ดลับในตอนท้ายของหน้าโค้ดของคุณอาจถูกเรียกว่าน้อยที่สุดเร็วที่สุดเล็กน้อย แต่ก็ไม่มีอะไรสำคัญ แต่ที่สำคัญกว่านั้นคือตัวเลือกนี้เกี่ยวข้องกับตำแหน่งที่คุณเชื่อมโยง JavaScript เข้ากับหน้า

หากคุณรวมscriptแท็กของคุณไว้ในheadและพึ่งพาreadyเบราว์เซอร์จะพบscriptแท็กของคุณก่อนที่แท็กจะแสดงสิ่งใด ๆ ต่อผู้ใช้ ในเหตุการณ์ปกติเบราว์เซอร์จะหยุดชะงักและไปและดาวน์โหลดสคริปต์ของคุณเริ่มการทำงานของตัวแปล JavaScript และส่งสคริปต์ไปที่สคริปต์นั้นจากนั้นรอในขณะที่ล่ามประมวลผลสคริปต์ (จากนั้น jQuery จะดูในรูปแบบต่างๆ เพื่อให้ DOM พร้อมใช้งาน) (ฉันพูดว่า "ตามปกติของสิ่งต่างๆ" เนื่องจากเบราว์เซอร์บางตัวรองรับasyncหรือdeferแอตทริบิวต์บนscriptแท็ก)

หากคุณใส่scriptแท็กไว้ที่ส่วนท้ายของbodyองค์ประกอบเบราว์เซอร์จะไม่ดำเนินการทั้งหมดจนกว่าหน้าเว็บของคุณจะแสดงต่อผู้ใช้เป็นส่วนใหญ่ ซึ่งจะช่วยเพิ่มเวลาในการโหลดหน้าเว็บของคุณ

ดังนั้นเพื่อให้ได้เวลาโหลดที่รับรู้ได้ดีที่สุดให้วางสคริปต์ของคุณที่ด้านล่างของหน้า (นี่เป็นแนวทางจากชาว Yahooด้วย) และหากคุณกำลังจะทำเช่นนั้นก็ไม่จำเป็นต้องใช้readyแต่แน่นอนว่าคุณทำได้ถ้าคุณชอบ

มีราคาสำหรับสิ่งนั้น: คุณต้องแน่ใจว่าสิ่งที่ผู้ใช้เห็นนั้นพร้อมที่จะโต้ตอบด้วย การย้ายเวลาในการดาวน์โหลดไปที่หลังจากที่เพจแสดงเป็นส่วนใหญ่คุณจะเพิ่มความเป็นไปได้ที่ผู้ใช้จะเริ่มโต้ตอบกับเพจก่อนที่สคริปต์ของคุณจะโหลด นั่นเป็นหนึ่งในข้อโต้แย้งในการวางscriptแท็กที่ท้าย บ่อยครั้งไม่ใช่ปัญหา แต่คุณต้องดูที่เพจของคุณเพื่อดูว่าเป็นหรือไม่และหากเป็นเช่นนั้นคุณต้องการจัดการกับมันอย่างไร (คุณสามารถใส่อิลิเมนต์อินไลน์ ขนาดเล็กลงscriptในheadที่ตั้งค่าตัวจัดการเหตุการณ์ทั้งเอกสารเพื่อรับมือกับสิ่งนี้ด้วยวิธีนี้คุณจะได้รับเวลาในการโหลดที่ดีขึ้น แต่ถ้า พวกเขาพยายามทำบางอย่างเร็วเกินไปคุณสามารถบอกพวกเขาว่าหรือดีกว่าจัดคิวสิ่งที่พวกเขาต้องการทำและทำเมื่อสคริปต์ฉบับเต็มของคุณพร้อม)


17
+1. อีกวิธีหนึ่งในการจัดการกับการโต้ตอบก่อนที่จะโหลด js คือการทำให้เพจทำงานได้โดยไม่ต้องใช้จาวาสคริปต์ ตรวจสอบให้แน่ใจว่าลิงก์ทั้งหมดทำงานและอื่น ๆ แม้ว่าลิงก์เหล่านี้จะทำให้เกิดการโหลดหน้าซ้ำ จากนั้นจี้ลิงก์และสิ่งอื่น ๆ ด้วย js และเพิ่ม ajax หรือระฆังและนกหวีดอื่น ๆ ของคุณ :)
Adrian Schmidt

1
คุณจะจัดการกับคิวการดำเนินการอย่างไร? มีรูปแบบการออกแบบหรือ "วิธีแก้ปัญหาทั่วไป" บางอย่างที่ฉันสามารถตรวจสอบได้หรือไม่?
HC_

@HC_: "การเข้าคิวการดำเนินการ" หมายความว่าอย่างไร
TJ Crowder

@TJCrowder จากประโยคสุดท้ายของคำตอบของคุณ: "หรือดีกว่าจัดคิวสิ่งที่พวกเขาต้องการทำและทำเมื่อสคริปต์เต็มของคุณพร้อม" ฉันแค่สงสัยว่ามีวิธีที่ "เหมาะสมที่สุด" ในการทำเช่นนี้หรือไม่เพราะฉันแน่ใจว่าฉันสามารถหาวิธี "บางอย่าง" ในการทำเช่นนี้ได้ แต่ฉันแน่ใจว่ามันจะ ... มองไปที่รหัสใด ๆ ที่เกี่ยวข้อง
HC_

2
@HC_: ฉันไม่เคยรู้สึกว่าต้องทำและไม่รู้ถึงมาตรฐานใด ๆ สำหรับมัน และอีกห้าปีต่อมาฉันคิดว่ามันจะดีกว่าที่จะพูดว่า "ขออภัยกำลังโหลดหนึ่งวินาที .. " แทน (แม้ว่าสิ่งนั้นจะโหลดช้า แต่คุณก็มีปัญหาที่ใหญ่กว่า) หากฉันเห็นบางสิ่งที่ฉันคิดว่าคลิกได้และคลิกแล้วและไม่มีอะไรเกิดขึ้นสวรรค์เท่านั้นที่รู้ว่าฉันจะคลิกอะไรต่อไป หากคุณจัดคิวแล้วเล่นใหม่เมื่อคุณพร้อมอาจเป็น ... น้อยกว่าอุดมคติ
TJ Crowder

3

หน้าของคุณจะโหลดช้าลงโดยการกระจาย$(document).ready()สคริปต์ไปทั่ว DOM (แทนที่จะเป็นทั้งหมดที่ส่วนท้าย) เนื่องจากต้องใช้ jQuery ในการโหลดแบบซิงโครนัสก่อน

$ = jQuery. ดังนั้นคุณจึงไม่สามารถใช้$ในสคริปต์ของคุณได้โดยไม่ต้องโหลด jQuery ก่อน วิธีนี้บังคับให้คุณโหลด jQuery ใกล้กับจุดเริ่มต้นของหน้าซึ่งจะหยุดการโหลดหน้าจนกว่า jQuery จะดาวน์โหลดเสร็จสมบูรณ์

คุณไม่สามารถasyncโหลด jQuery ได้เนื่องจากในหลาย ๆ กรณี$(document).ready()สคริปต์ของคุณจะพยายามดำเนินการก่อนที่ jQuery จะโหลดแบบ async อย่างสมบูรณ์และทำให้เกิดข้อผิดพลาดเนื่องจาก$ยังไม่ได้กำหนดอีกครั้ง

ที่ถูกกล่าวว่ามีวิธีการหลอกระบบ โดยพื้นฐานแล้วการตั้งค่า$เท่ากับฟังก์ชันที่ผลัก$(document).ready()ฟังก์ชันไปยังคิว / อาร์เรย์ จากนั้นที่ด้านล่างของหน้าให้โหลด jQuery จากนั้นวนซ้ำตามคิวและดำเนินการทีละ$(document).ready()รายการ สิ่งนี้ช่วยให้คุณเลื่อน jQuery ไปที่ด้านล่างของหน้า แต่ยังคงใช้$ด้านบนใน DOM โดยส่วนตัวแล้วฉันยังไม่ได้ทดสอบว่ามันทำงานได้ดีเพียงใด แต่ทฤษฎีนั้นฟังดูดี แนวคิดนี้เกิดขึ้นมาระยะหนึ่งแล้ว แต่ฉันไม่ค่อยได้เห็นการนำไปใช้มากนัก แต่ดูเหมือนเป็นความคิดที่ดี:

http://samsaffron.com/archive/2012/02/17/stop-paying-your-jquery-tax

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