Sự khác biệt giữa các sự kiện DOMContentLoaded và load


Câu trả lời:


191

Từ Trung tâm nhà phát triển Mozilla :

Sự kiện DOMContentLoaded được kích hoạt khi tài liệu đã được tải và phân tích cú pháp hoàn toàn, không cần chờ biểu định kiểu, hình ảnh và khung con để tải xong (sự kiện tải có thể được sử dụng để phát hiện trang được tải đầy đủ).


27
Fyi, cùng một liên kết MDN [bây giờ] cũng cho biết: "Lưu ý: Biểu định kiểu tải thực thi tập lệnh chặn, vì vậy nếu bạn có <script> sau <link rel =" biểu định kiểu "...>, trang sẽ không hoàn thành phân tích cú pháp - và DOMContentLoaded sẽ không kích hoạt - cho đến khi biểu định kiểu được tải. "
Nick

10
@Nick Trang này đưa ra lý do. html5rocks.com/en/tutorials/iternals/howbrowserswork Tôi khuyên bạn nên xem video trong trang mặc dù.
abhisekp

1
@abhisekp hướng dẫn tốt đẹp mặc dù liên kết video đó đã lỗi thời
supi

Vì vậy, cây render được xây dựng sau khi DOMContentLoaded được kích hoạt. Nhưng DOMContentLoaded không đợi hình ảnh / tài nguyên phụ / khung con hoàn thành tải theo developer.mozilla.org/en-US/docs/Web/API/Window/ tựa . Bạn có biết nếu các hình ảnh / khung con / tài nguyên phụ này được gọi bởi Cây kết xuất sau khi nó được xây dựng hay chúng đã được gọi bởi cây DOM trong khi cây kết xuất vẫn đang được xây dựng? Nói cách khác, cây kết xuất có kích hoạt một loạt các kết nối để tải xuống những hình ảnh / khung con / nguồn phụ này hay quá trình tải xuống của chúng đã được tiến hành trước đó không?
Sydfwefwqg3

83

Sự DOMContentLoadedkiện sẽ kích hoạt ngay khi hệ thống phân cấp DOM được xây dựng đầy đủ, loadsự kiện sẽ thực hiện khi tất cả các hình ảnh và khung phụ đã tải xong.

DOMContentLoadedsẽ hoạt động trên hầu hết các trình duyệt hiện đại, nhưng không phải trên IE kể cả IE9 trở lên. Có một số cách giải quyết để bắt chước sự kiện này trên các phiên bản IE cũ hơn, như được sử dụng trên thư viện jQuery, chúng đính kèm sự kiện cụ thể của IE onreadystatechange .


7
Sự kiện nào bạn đang đề cập đến khi bạn nói "Sự kiện này"?
Tom Hubbard

2
"Sự kiện này" = DOMContentLoaded. Nó không hoạt động trong IE8. Nếu bạn cần hỗ trợ, hãy sử dụng cách giải quyết mà CMS liên kết đến
Jan Derk

53

Xem sự khác biệt của chính bạn:

BẢN GIỚI THIỆU

Từ Microsoft IE

Sự kiện DOMContentLoaded kích hoạt khi phân tích cú pháp của trang hiện tại hoàn tất; sự kiện tải sẽ kích hoạt khi tất cả các tệp đã tải xong từ tất cả các tài nguyên, bao gồm quảng cáo và hình ảnh. DOMContentLoaded là một sự kiện tuyệt vời để sử dụng để kết nối chức năng UI với các trang web phức tạp.

Từ mạng nhà phát triển Mozilla

Sự kiện DOMContentLoaded được kích hoạt khi tài liệu đã được tải và phân tích cú pháp hoàn toàn, không cần chờ biểu định kiểu, hình ảnh và khung con để tải xong (sự kiện tải có thể được sử dụng để phát hiện trang được tải đầy đủ).


DOMContentLoadedđảm bảo rằng tất cả các tập lệnh (bao gồm cả defer / async) đã được tải không? Không có gì được nói ở đây về các tập lệnh: developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
Sergey

@Sergey Không. tài nguyên async - tức là <script async src = app.js /> - được tải độc lập với phần còn lại của trang do đó DOMContentLoaded có thể được kích hoạt trước khi tài nguyên được tải từ máy chủ
Mehrad Sadegh

1
@MehradSadegh Tôi nghĩ bạn đã sai! Từ tài liệu MDN : Các tập lệnh với thuộc tính defer sẽ ngăn sự kiện DOMContentLoaded kích hoạt cho đến khi tập lệnh được tải và hoàn thành đánh giá. Bạn có thể xem câu hỏi SO này, xác nhận nó: stackoverflow.com/questions/42950574/
mẹo

1
@Jatimir Tôi nghĩ các thuộc tính defer và async có hành vi khác nhau.
Mehrad Sadegh

1
@Jatimir Vui mừng dù bạn đã đăng, vì đóng góp của bạn là chính xác, những gì tôi đang tìm kiếm! Cảm ơn bạn!
Robert Wildling

29

DOMContentLoaded==window.onDomReady()

Load==window.onLoad()

Một trang không thể được thao tác an toàn cho đến khi tài liệu "sẵn sàng". jQuery phát hiện trạng thái sẵn sàng này cho bạn. Mã được bao gồm trong $ (document). Yet () sẽ chỉ chạy khi trang Mô hình đối tượng tài liệu (DOM) đã sẵn sàng để mã JavaScript thực thi. Mã được bao gồm trong $ (window) .load (function () {...}) sẽ chạy khi toàn bộ trang (hình ảnh hoặc iframe), không chỉ DOM, đã sẵn sàng.

Xem: http://learn.jquery.com/USE-jquery-core/document- yet /


1
Câu hỏi không phải là về jQuery.
dùng34660

4
@ user34660 Không phải vậy, nhưng hữu ích để hiểu.
Anderson

16
  • domContentLoaded : đánh dấu điểm khi cả DOM đã sẵn sàng và không có bảng định kiểu nào đang chặn thực thi JavaScript - có nghĩa là bây giờ chúng ta có thể (có khả năng) xây dựng cây kết xuất. Nhiều khung JavaScript chờ sự kiện này trước khi chúng bắt đầu thực hiện logic riêng của chúng. Vì lý do này, trình duyệt chụp các dấu thời gian của EventStart và EventEnd để cho phép chúng tôi theo dõi thời gian thực hiện này.

  • loadEvent : là bước cuối cùng trong mỗi trang tải trình duyệt sẽ kích hoạt một sự kiện trên Tải trực tiếp có thể kích hoạt logic ứng dụng bổ sung.

nguồn


Nếu tôi có bất kỳ thẻ script nào có url tới JS, chúng sẽ tải trước domContentLoaded hay sau?
Pavan

0

Đây là một số mã làm việc cho chúng tôi. Chúng tôi thấy MSIE bị tấn công và bỏ lỡ DomContentLoaded, dường như có một số độ trễ khi không có tài nguyên bổ sung nào được lưu vào bộ nhớ cache (tối đa 300ms dựa trên ghi nhật ký bảng điều khiển của chúng tôi) và nó kích hoạt quá nhanh khi chúng được lưu trữ. Vì vậy, chúng tôi đã sử dụng một dự phòng cho MISE. Bạn cũng muốn kích hoạt doStuff()chức năng cho dù DomContentLoadedkích hoạt trước hay sau các tệp JS bên ngoài của bạn.

// 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();
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.