ความแตกต่างระหว่าง DOMContentLoaded และโหลดเหตุการณ์


คำตอบ:


191

จากศูนย์นักพัฒนา Mozilla :

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


27
Fyi, ลิงค์ MDN เดียวกัน [ตอนนี้] ก็พูดว่า: "หมายเหตุ: Stylesheet จะทำการบล็อกสคริปต์การทำงานดังนั้นหากคุณมี <script> หลังจาก <link rel =" สไตล์ชีท "... > หน้าจะไม่เสร็จในการแยกวิเคราะห์ - และ DOMContentLoaded จะไม่เริ่มทำงานจนกว่าจะมีการโหลดสไตล์ชีท "
Nick

10
@Nick หน้านี้ให้เหตุผล html5rocks.com/th/tutorials/internals/howbrowsersworkฉันขอแนะนำให้ดูวิดีโอในหน้านี้
abhisekp

1
@abhisekp บทช่วยสอนที่ดีแม้ว่าลิงก์วิดีโอจะล้าสมัยไปแล้ว
supi

ดังนั้นต้นไม้เรนเดอร์จึงสร้างขึ้นหลังจาก DOMContentLoaded ถูกยิง แต่ DOMContentLoaded ไม่รอให้ images / ย่อยทรัพยากร / subframes กับการโหลดเสร็จตามdeveloper.mozilla.org/en-US/docs/Web/API/Window/... คุณรู้หรือไม่ว่าทรัพยากรรูปภาพ / subframes / sub เหล่านี้ถูกเรียกโดย Render Tree หลังจากที่มันถูกสร้างขึ้นหรือพวกมันถูกเรียกโดยต้นไม้ DOM ในขณะที่ต้นไม้เรนเดอร์ยังคงถูกสร้างอยู่หรือไม่? กล่าวอีกนัยหนึ่งโครงสร้างการแสดงผลเป็นต้นเหตุให้มีการเชื่อมต่อมากมายเพื่อดาวน์โหลดรูปภาพ / subframes / subresources หรือการดาวน์โหลดที่กำลังดำเนินการมาก่อนหรือไม่
weefwefwqg3

83

DOMContentLoadedเหตุการณ์จะยิงเร็วที่สุดเท่าที่ลำดับชั้น DOM ได้รับการสร้างขึ้นได้อย่างสมบูรณ์ในloadเหตุการณ์ที่จะทำมันเมื่อภาพทั้งหมดและเฟรมย่อยมีการโหลดเสร็จแล้ว

DOMContentLoadedจะทำงานบนเบราว์เซอร์ที่ทันสมัยที่สุดแต่ไม่ใช่ใน IEรวมถึง IE9 ขึ้นไป มีวิธีแก้ไขปัญหาบางอย่างเพื่อเลียนแบบเหตุการณ์นี้ใน IE เวอร์ชันเก่าเช่นที่ใช้ในไลบรารี jQuery พวกเขาแนบเหตุการณ์เฉพาะ IE onreadystatechange


7
เหตุการณ์ใดที่คุณอ้างถึงเมื่อคุณพูดว่า "เหตุการณ์นี้"
Tom Hubbard

2
"เหตุการณ์นี้" = DOMContentLoaded มันไม่ทำงานใน IE8 หากคุณต้องการสนับสนุนให้ใช้วิธีการแก้ปัญหาที่ CMS เชื่อมโยงไปยัง
Jan Derk

53

เห็นความแตกต่างด้วยตัวคุณเอง:

การสาธิต

จากMicrosoft IE

เหตุการณ์ DOMContentLoaded เริ่มทำงานเมื่อการวิเคราะห์หน้าปัจจุบันเสร็จสมบูรณ์ เหตุการณ์โหลดจะเริ่มขึ้นเมื่อไฟล์ทั้งหมดโหลดเสร็จจากแหล่งข้อมูลทั้งหมดรวมถึงโฆษณาและรูปภาพ DOMContentLoaded เป็นเหตุการณ์ที่ยอดเยี่ยมในการใช้ฟังก์ชันเชื่อมต่อของ UI กับเว็บเพจที่ซับซ้อน

จากMozilla Developer Network

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


ไม่DOMContentLoadedรับประกันว่าโหลดสคริปต์ทั้งหมด (รวมถึง defer / async) แล้วหรือยัง? ไม่มีการพูดถึงที่นี่เกี่ยวกับสคริปต์: developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
Sergey

@Sergey Nope ทรัพยากร async - เช่น <script async src = app.js /> - ถูกโหลดอย่างอิสระจากส่วนที่เหลือของหน้าเว็บดังนั้น DOMContentLoaded อาจถูกเรียกใช้ก่อนที่จะดึงทรัพยากรจากเซิร์ฟเวอร์
Mehrad Sadegh

1
@ MehradSadegh ฉันคิดว่าคุณผิด! จากเอกสาร MDN : สคริปต์ที่มีแอตทริบิวต์ defer จะป้องกันไม่ให้เหตุการณ์ DOMContentLoaded เริ่มทำงานจนกว่าสคริปต์จะโหลดและประเมินผลเสร็จสิ้น คุณสามารถดูคำถาม SO นี้ซึ่งยืนยันได้: stackoverflow.com/questions/42950574/…
radzak

1
@Jatimir ฉันคิดว่าคุณสมบัติที่เลื่อนและ async มีพฤติกรรมที่แตกต่างกัน
Mehrad Sadegh

1
@Jatimir ดีใจที่คุณโพสต์เพราะการสนับสนุนของคุณเป็นสิ่งที่ฉันกำลังมองหา! ขอบคุณ!
Robert Wildling

29

DOMContentLoaded==window.onDomReady()

Load==window.onLoad()

ไม่สามารถจัดการหน้าอย่างปลอดภัยได้จนกว่าเอกสารจะ "พร้อม" jQuery ตรวจพบสถานะของความพร้อมนี้สำหรับคุณ รหัสที่รวมอยู่ใน $ (document) .ready () จะทำงานเมื่อหน้าเอกสาร Object Model (DOM) พร้อมสำหรับโค้ด JavaScript เพื่อดำเนินการ รหัสที่รวมอยู่ใน $ (หน้าต่าง) .load (ฟังก์ชั่น () {... }) จะทำงานเมื่อหน้าทั้งหมด (รูปภาพหรือ iframes) ไม่ใช่แค่ DOM เท่านั้นพร้อม

ดู: http://learn.jquery.com/using-jquery-core/document-ready/


1
คำถามไม่ได้เกี่ยวกับ jQuery
user34660

4
@ user34660 ไม่ใช่ แต่เป็นประโยชน์ที่จะเข้าใจ
Anderson

16
  • domContentLoaded : ทำเครื่องหมายจุดเมื่อ DOM พร้อมแล้วและไม่มีสไตล์ชีตที่บล็อกการทำงานของ JavaScript - ซึ่งหมายความว่าตอนนี้เราสามารถสร้างแผนผังการแสดงผลได้แล้ว (อาจ) เฟรมเวิร์ก JavaScript จำนวนมากรอเหตุการณ์นี้ก่อนที่จะเริ่มดำเนินการตรรกะของตนเอง ด้วยเหตุผลนี้เบราว์เซอร์จะบันทึกการประทับเวลา EventStart และ EventEnd เพื่อให้เราสามารถติดตามว่าการดำเนินการนี้ใช้เวลานานเท่าใด

  • loadEvent : เป็นขั้นตอนสุดท้ายในทุกหน้าโหลดเบราว์เซอร์ไฟเหตุการณ์ "onload" ซึ่งสามารถเรียกตรรกะแอปพลิเคชันเพิ่มเติม

แหล่ง


หากฉันมีแท็กสคริปต์ที่มี url ถึง JS พวกเขาจะโหลดก่อน domContentLoaded หรือหลังจาก
Pavan

0

นี่คือรหัสบางอย่างที่เหมาะกับเรา เราพบว่า MSIE ถูกตีและพลาดไปDomContentLoadedดูเหมือนว่าจะมีความล่าช้าบ้างเมื่อไม่มีทรัพยากรเพิ่มเติมถูกแคช (มากถึง 300ms ตามการบันทึกคอนโซลของเรา) และมันจะทริกเกอร์เร็วเกินไปเมื่อถูกแคช ดังนั้นเราจึงหันไปใช้ทางเลือกสำหรับ MISE คุณต้องการทริกเกอร์doStuff()ฟังก์ชันไม่ว่าจะDomContentLoadedทริกเกอร์ก่อนหรือหลังไฟล์ JS ภายนอกของคุณ

// detect MSIE 9,10,11, but not Edge
ua=navigator.userAgent.toLowerCase();isIE=/msie/.test(ua);

function doStuff(){
    //
}
if(isIE){
    // play it safe, very few users, exec ur JS when all resources are loaded
    window.onload=function(){doStuff();}
} else {
    // add event listener to trigger your function when DOMContentLoaded
    if(document.readyState==='loading'){
        document.addEventListener('DOMContentLoaded',doStuff);
    } else {
        // DOMContentLoaded already loaded, so better trigger your function
        doStuff();
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.