Tôi sử dụng tải tập lệnh động để giảm thời lượng tải trang ban đầu. Để đảm bảo rằng các hàm và đối tượng được xác định bởi một tập lệnh có thể truy cập được, tôi cần đảm bảo rằng tập lệnh đã được tải đầy đủ.Script.readyState có thể được tin cậy để phát hiện kết thúc tải tập lệnh động không?
Tôi đã phát triển my own Javascript library cho mục đích này và do đó đã thực hiện rất nhiều nghiên cứu về chủ đề này, nghiên cứu cách thực hiện trong các thư viện khác nhau. Trong một cuộc thảo luận liên quan đến vấn đề này, Kyle Simpson, tác giả của LABjs, tuyên bố rằng:
LABjs (và nhiều bộ tải khác) thiết cả "onload" và "onreadystatechange" trên tất cả các yếu tố kịch bản, biết rằng một số trình duyệt sẽ cháy một, và một số sẽ cháy khác ...
Bạn có thể tìm thấy một ví dụ về điều này trong the current version of jQuery as of this writing, v1.3.2:
// Attach handlers for all browsers
script.onload = script.onreadystatechange = function(){
if (!done && (!this.readyState ||
this.readyState == "loaded" || this.readyState == "complete")) {
done = true;
success();
complete();
// Handle memory leak in IE
script.onload = script.onreadystatechange = null;
head.removeChild(script);
}
};
Đó là trạng thái của nghệ thuật, nhưng trong quá trình phân tích một hành vi lạ trong Opera 9.64, tôi đi đến kết luận rằng, bằng cách sử dụng kỹ thuật này, cuộc gọi lại bị bắn quá sớm.
Tôi sẽ đăng các phát hiện của riêng mình để trả lời cho câu hỏi này và muốn thu thập thêm bằng chứng và phản hồi từ cộng đồng.
Bất kỳ ai tìm mã hiện tại trong nhánh 1.x-master jQuery? Có vẻ như họ đã bỏ bằng cách sử dụng '.onreadystatechange' và' .onload' và thay thế chúng bằng lời hứa? [Clicky] (https://github.com/jquery/jquery/blob/1.x-master/src/ajax.js) – Campbeln