DOMContentLoaded ve load olayları arasındaki fark


Yanıtlar:


191

Gönderen Mozilla Geliştirici Merkezi'ndeki :

DOMContentLoaded olayı, stil sayfaları, resimler ve alt karelerin yüklenmesini bitirmesini beklemeden belge tamamen yüklendiğinde ve ayrıştırıldığında tetiklenir (load olayı tam yüklü bir sayfayı algılamak için kullanılabilir).


27
Aynı MDN bağlantısı [şimdi] de şunu söylüyor: "Not: Stil Sayfası blok komut dosyası yürütmesini yükler, bu nedenle <link rel =" stylesheet "...> öğesinden sonra bir <script> varsa, sayfa ayrıştırmayı bitirmez - ve DOMContentLoaded tetiklenmez - stil sayfası yüklenene kadar. "
Nick

10
@Nick Bu sayfa bunun sebebini veriyor. html5rocks.com/en/tutorials/internals/howbrowserswork Yine de sayfadaki videoyu izlemenizi tavsiye ederim.
abhisekp

1
@abhisekp güzel öğretici rağmen bu video bağlantısı artık eski
supi

Böylece render ağacı DOMContentLoaded çalıştırıldıktan sonra oluşturulur. Ama DOMContentLoaded göre bitiş yükleme görüntüleri / alt kaynaklar / alt çerçeveleri beklemez developer.mozilla.org/en-US/docs/Web/API/Window/... . Bu görüntülerin / alt çerçevelerin / alt kaynakların oluşturulduktan sonra Oluşturma Ağacı tarafından çağrılıp çağrılmadığını veya oluşturma ağacı hala inşa edilirken DOM ağacı tarafından zaten çağrıldığını biliyor musunuz? Başka bir deyişle, render ağacı bu görüntüleri / alt çerçeveleri / alt kaynakları indirmek için bir grup bağlantıyı tetikliyor mu veya indirmeleri zaten devam ediyor mu?
weefwefwqg3

83

DOMContentLoadedOlay kısa sürede DOM hiyerarşi tamamen inşa edildiği gibi, ateş edeceği loadtüm resimler ve alt çerçeveler bitmiş yükleme olduğunda olay yapacak.

DOMContentLoadedçoğu modern tarayıcıda çalışır, ancak IE9 ve üstü dahil IE'de çalışmaz . JQuery kitaplığında kullanılan gibi IE'nin eski sürümlerinde bu olayı taklit etmek için bazı geçici çözümler vardır , bunlar IE'ye özgü onreadystatechange olayı ekler.


7
"Bu olay" dediğinizde hangi olaydan bahsediyorsunuz?
Tom Hubbard

2
"This event" = DOMContentLoaded. IE8'de çalışmaz. Desteklemeniz gerekiyorsa, CMS'nin bağlandığı geçici çözümü kullanın
Jan Derk

53

Farkı kendiniz görün:

DEMO

Gönderen Microsoft IE

Geçerli sayfanın ayrıştırılması tamamlandığında DOMContentLoaded olayı tetiklenir; load olayı, tüm dosyalar reklamlar ve resimler dahil tüm kaynaklardan yüklemeyi tamamladığında tetiklenir. DOMContentLoaded, UI işlevselliğini karmaşık web sayfalarına bağlamak için harika bir etkinliktir.

Gönderen Mozilla Geliştirici Ağı

DOMContentLoaded olayı, stil sayfaları, resimler ve alt karelerin yüklenmesini bitirmesini beklemeden belge tamamen yüklendiğinde ve ayrıştırıldığında tetiklenir (load olayı tam yüklü bir sayfayı algılamak için kullanılabilir).


DOMContentLoadedTüm komut dosyalarının (erteleme / zaman uyumsuzluk dahil) yüklendiğini garanti ediyor mu ? Burada komut dosyaları hakkında hiçbir şey söylenmez: developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
Sergey

@Sergey Nope. async kaynakları - yani <script async src = app.js /> - sayfanın geri kalanından bağımsız olarak yüklenir, bu nedenle DOMContentLoaded kaynak sunucudan getirilmeden önce tetiklenebilir
Mehrad Sadegh

1
@MehradSadegh Sanırım yanlışsın! Gönderen MDN belgelerinde : erteleme özelliği olan komut dosyaları komut yüklenir ve değerlendirilmesi tamamlanana kadar tetiklenmesini DOMContentLoaded olayı önleyecektir. Bunu doğrulayan şu SO sorusuna bir göz atabilirsiniz: stackoverflow.com/questions/42950574/…
radzak

1
@Jatimir Sanırım erteleme ve zaman uyumsuzlukların farklı davranışları vardır.
Mehrad Sadegh

1
@Jatimir Yine de gönderdiğinize sevindim, çünkü katkınız tam olarak aradığım şeydi! Teşekkür ederim!
Robert Wildling

29

DOMContentLoaded==window.onDomReady()

Load==window.onLoad()

Bir sayfa, belge "hazır" olana kadar güvenli bir şekilde değiştirilemez. jQuery sizin için bu hazır olma durumunu algılar. $ (Document) .ready () içine dahil edilen kod yalnızca Belge Nesne Modeli (DOM) sayfasının JavaScript kodunun yürütülmesine hazır olması durumunda çalışır. $ (Window) .load (function () {...}) içindeki kod, yalnızca DOM değil, tüm sayfa (resimler veya iframe'ler) hazır olduğunda çalışır.

Bkz. Http://learn.jquery.com/using-jquery-core/document-ready/


1
Soru jQuery ile ilgili değil.
user34660

4
@ user34660 Değil, ama anlaşılması yararlı.
Anderson

16
  • domContentLoaded : Hem DOM hazır olduğunda hem de JavaScript yürütülmesini engelleyen stil sayfaları olmadığında noktayı işaretler - yani artık (potansiyel olarak) render ağacını oluşturabiliriz. Birçok JavaScript çerçevesi, kendi mantıklarını yürütmeye başlamadan önce bu etkinliği bekler. Bu nedenle tarayıcı, bu yürütmenin ne kadar sürdüğünü takip etmemize izin vermek için EventStart ve EventEnd zaman damgalarını yakalar.

  • loadEvent : her sayfa yüklemesinde son adım olarak tarayıcı ek uygulama mantığını tetikleyebilecek bir “yükleme” olayı başlatır .

kaynak


JS URL'si ile herhangi bir komut dosyası etiketleri varsa, onlar domContentLoaded önce veya sonra yük?
Pavan

0

İşte bizim için çalışan bazı kodlar. MSIE'nin vurulduğunu ve kaçırıldığını gördük DomContentLoaded, hiçbir ek kaynak önbelleğe alınmadığında bir miktar gecikme var gibi görünüyor (konsol günlük kaydımıza dayanarak 300 ms'ye kadar) ve önbelleğe alındıklarında çok hızlı tetikleniyor. Bu yüzden MISE için bir yedeğe başvurduk. Ayrıca tetiklemek istiyorum doStuff()fonksiyonu olsun DomContentLoadedönce ya da harici JS dosyaları sonra tetikleyiciler.

// 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();
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.