2013-08-08 29 views
20

Ví dụ: tôi đang tạo trò chơi. Tôi có một kịch bản nhỏ có công việc là để tải tất cả các tài sản và trình bày một thanh tiến trình cho người dùng trong khi tải tài sản.Tôi làm cách nào để có được tiến trình tải xuống <script>?

Một nội dung như vậy là một tập lệnh khá lớn chứa logic trò chơi. Có lẽ lên tới 3 MB.

Tôi làm cách nào để hiển thị tiến độ tải của tập lệnh thứ hai cho người dùng?

+0

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

+0

Đó 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. –

Trả lời

27

<script> thẻ chỉ kích hoạt loaderror 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).

1

Bạn có thể muốn có một cái nhìn tại How to show loading status in percentage for ajax response?

Đó là để xem tình trạng của một download AJAX. Vì bạn đang tải một tập lệnh, nó có thể không phải là cách tốt nhất để lấy tệp nhưng nó có thể hoạt động. Sau đó, bạn sẽ cần phải đặt nội dung nhận được bởi cuộc gọi ajax ở đâu đó để thực hiện, và eval không được khuyến khích.

+4

Điều này có vẻ giống như trường hợp sử dụng được chấp nhận đối với 'eval'. Bạn có một lý do thực sự để không giới thiệu nó, hoặc là bạn chỉ nói rằng mindlessly? – andrewrk

+1

'eval' được tạo ra để làm những việc như thế này. Những lần duy nhất 'eval' không được khuyến khích là khi nó không cần thiết, hoặc đó là một nguy cơ bảo mật lớn. Cách duy nhất này có thể là một nguy cơ bảo mật sẽ là một cuộc tấn công man-in-the-middle hoặc một máy chủ bị xâm nhập - cả hai đều cung cấp những rủi ro lớn hơn so với 'eval'. – h2ooooooo

+0

Tôi luôn được yêu cầu không sử dụng eval trừ khi bạn thực sự cần ... Vì vậy, bạn có thể đúng. Có thể việc chèn thẻ tập lệnh cũng có thể được thực hiện, giống như requireJS, chúng phải có lý do để không sử dụng eval? – Salketer

Các vấn đề liên quan