<script>
thẻ chỉ kích hoạt load
và error
sự kiện; họ không bắn progress
sự kiện. Tuy nhiên, trong các trình duyệt hiện đại, Ajax requests do support progress
events. Bạn có thể tải nội dung kịch bản của bạn và theo dõi sự tiến bộ qua Ajax, và sau đó đặt các nội dung kịch bản vào một yếu tố mới <script>
khi tải hoàn thành:
var req = new XMLHttpRequest();
// report progress events
req.addEventListener("progress", function(event) {
if (event.lengthComputable) {
var percentComplete = event.loaded/event.total;
// ...
} else {
// Unable to compute progress information since the total size is unknown
}
}, false);
// load responseText into a new script element
req.addEventListener("load", function(event) {
var e = event.target;
var s = document.createElement("script");
s.innerHTML = e.responseText;
// or: s[s.innerText!=undefined?"innerText":"textContent"] = e.responseText
document.documentElement.appendChild(s);
s.addEventListener("load", function() {
// this runs after the new script has been executed...
});
}, false);
req.open("GET", "foo.js");
req.send();
Đối với các trình duyệt cũ không hỗ trợ Ajax progress
, bạn có thể xây dựng của bạn giao diện người dùng báo cáo tiến độ chỉ hiển thị thanh tải sau sự kiện progress
đầu tiên (hoặc nếu không, hiển thị một spinner chung nếu không có progress
sự kiện nào xảy ra).
Liên quan chặt chẽ: [requirejs load script progress] (http://stackoverflow.com/questions/15581563/requirejs-load-script-progress) ("* RequrieJs tải mô-đun bằng cách tạo thẻ tập lệnh mới trong DOM và lắng nghe sự kiện tải. Không có sự kiện cập nhật nào giữa tải bắt đầu và kết thúc. * ") – apsillers
Đó là điều trình duyệt, không nằm trong tầm kiểm soát của chúng tôi với tư cách là người lập trình. Chỉ khi trình duyệt kết thúc tải và "biên dịch" tệp JS, bạn có thể truy cập nó để cách duy nhất tôi có thể thấy là sử dụng một số tệp nhỏ hơn và tách logic giữa chúng. –