Perbedaan antara DOMContentLoaded dan memuat acara


Jawaban:


191

Dari Pusat Pengembang Mozilla :

Acara DOMContentLoaded dipecat ketika dokumen telah dimuat dan diuraikan sepenuhnya, tanpa menunggu stylesheet, gambar, dan subframe untuk menyelesaikan pemuatan (peristiwa pemuatan dapat digunakan untuk mendeteksi halaman yang dimuat penuh).


27
Fyi, tautan MDN yang sama [sekarang] juga mengatakan: "Catatan: Stylesheet memuat eksekusi skrip blok, jadi jika Anda memiliki <script> setelah <link rel =" stylesheet "...>, halaman tidak akan selesai parsing - dan DOMContentLoaded tidak akan diaktifkan - sampai stylesheet dimuat. "
Nick

10
@Belah Halaman ini memberikan alasannya. html5rocks.com/en/tutorials/internals/howbrowserswork Saya akan merekomendasikan menonton video di halaman.
abhisekp

1
@abhisekp tutorial yang bagus meskipun tautan video itu sekarang sudah usang
supi

Jadi pohon render dibangun setelah DOMContentLoaded dipecat. Tetapi DOMContentLoaded tidak menunggu gambar / sub-sumber daya / subframe selesai dimuat sesuai dengan developer.mozilla.org/en-US/docs/Web/API/Window/… . Apakah Anda tahu jika gambar / subframe / sumber daya sub ini dipanggil oleh Render Tree setelah dibangun, atau apakah mereka sudah dipanggil oleh pohon DOM saat pohon render masih sedang dibangun? Dengan kata lain, apakah pohon render memicu banyak koneksi untuk mengunduh gambar / subframe / sub-sumber daya ini atau unduhan mereka sudah berlangsung sebelumnya?
weefwefwqg3

83

The DOMContentLoadedacara akan api segera hirarki DOM telah sepenuhnya dibangun, loadacara akan melakukannya ketika semua gambar dan sub-frame memiliki pemuatan selesai.

DOMContentLoadedakan bekerja pada sebagian besar browser modern, tetapi tidak pada IE termasuk IE9 dan di atasnya. Ada beberapa solusi untuk meniru acara ini di versi IE yang lebih lama, seperti yang digunakan di perpustakaan jQuery, mereka melampirkan acara khusus IE onreadystatechange .


7
Acara apa yang Anda maksud ketika Anda mengatakan "Acara ini"?
Tom Hubbard

2
"Acara ini" = DOMContentLoaded. Tidak berfungsi di IE8. Jika Anda perlu mendukungnya gunakan solusi yang terhubung ke CMS
Jan Derk

53

Lihat perbedaannya sendiri:

DEMO

Dari Microsoft IE

Acara DOMContentLoaded menyala ketika parsing halaman saat ini selesai; acara pemuatan menyala ketika semua file selesai memuat dari semua sumber, termasuk iklan dan gambar. DOMContentLoaded adalah acara yang hebat untuk digunakan untuk menghubungkan fungsionalitas UI ke halaman web yang kompleks.

Dari Jaringan Pengembang Mozilla

Acara DOMContentLoaded dipecat ketika dokumen telah dimuat dan diuraikan sepenuhnya, tanpa menunggu stylesheet, gambar, dan subframe untuk menyelesaikan pemuatan (peristiwa pemuatan dapat digunakan untuk mendeteksi halaman yang dimuat penuh).


Apakah DOMContentLoadedmenjamin bahwa semua skrip (termasuk menunda / async) telah dimuat? Tidak ada yang dikatakan di sini tentang skrip: developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
Sergey

@Sergey Tidak. sumber daya async - yaitu <script async src = app.js /> - dimuat secara independen dari sisa halaman sehingga DOMContentLoaded akan dipicu sebelum sumber diambil dari server
Mehrad Sadegh

1
@MehradSadegh saya pikir Anda salah! Dari dokumentasi MDN : Skrip dengan atribut defer akan mencegah peristiwa DOMContentLoaded agar tidak aktif hingga skrip dimuat dan selesai mengevaluasi. Anda dapat melihat pada pertanyaan SO ini, yang mengonfirmasinya: stackoverflow.com/questions/42950574/…
radzak

1
@ Jatimir Saya pikir atribut penangguhan dan async memiliki perilaku yang berbeda.
Mehrad Sadegh

1
@Jatimir Senang Anda memposting, karena kontribusi Anda tepat, apa yang saya cari! Terima kasih!
Robert Wildling

29

DOMContentLoaded==window.onDomReady()

Load==window.onLoad()

Halaman tidak dapat dimanipulasi dengan aman sampai dokumen "siap." jQuery mendeteksi kondisi kesiapan ini untuk Anda. Kode yang disertakan dalam $ (dokumen) .ready () hanya akan berjalan setelah halaman Document Object Model (DOM) siap untuk dieksekusi kode JavaScript. Kode yang termasuk dalam $ (window) .load (function () {...}) akan berjalan setelah seluruh halaman (gambar atau iframe), bukan hanya DOM, siap.

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


1
Pertanyaannya bukan tentang jQuery.
user34660

4
@ user34660 Bukan, tapi membantu untuk mengerti.
Anderson

16
  • domContentLoaded : menandai titik ketika kedua DOM siap dan tidak ada stylesheet yang memblokir eksekusi JavaScript - artinya kita sekarang dapat (berpotensi) membangun pohon render. Banyak kerangka kerja JavaScript menunggu acara ini sebelum mulai menjalankan logikanya sendiri. Karena alasan ini browser menangkap cap waktu EventStart dan EventEnd untuk memungkinkan kami melacak berapa lama waktu yang diperlukan untuk eksekusi ini.

  • loadEvent : sebagai langkah terakhir di setiap halaman memuat browser akan mengaktifkan "onload" yang dapat memicu logika aplikasi tambahan.

sumber


Jika saya memiliki tag skrip dengan url ke JS, apakah akan memuatnya sebelum domContentLoaded atau sesudahnya?
Pavan

0

Inilah beberapa kode yang berfungsi untuk kita. Kami menemukan MSIE terkena dan luput DomContentLoaded, tampaknya ada beberapa penundaan ketika tidak ada sumber daya tambahan di-cache (hingga 300 ms berdasarkan pada logging konsol kami), dan itu memicu terlalu cepat ketika mereka di-cache. Jadi kami terpaksa mundur untuk MISE. Anda juga ingin memicu doStuff()fungsi apakah DomContentLoadedmemicu sebelum atau setelah file JS eksternal Anda.

// 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();
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.