2010-05-10 22 views
5

CẬP NHẬT:Làm cách nào để trì hoãn việc chạy một số mã JS cho đến khi TẤT CẢ các tệp JS không đồng bộ của tôi được tải xuống?

Tôi có đoạn mã sau:

<script type="text/javascript"> 
function addScript(url) { 
    var script = document.createElement('script'); 
    script.src = url; 
    document.getElementsByTagName('head')[0].appendChild(script); 
} 
addScript('http://google.com/google-maps.js'); 
addScript('http://jquery.com/jquery.js'); 

... 

// run code below this point once both google-maps.js & jquery.js has been downloaded and excuted 

</script> 

Làm thế nào tôi có thể ngăn chặn mã từ thực hiện cho đến khi tất cả các yêu cầu JS đã tải về và thực hiện? Trong ví dụ trên, các tệp được yêu cầu đó là google-maps.js và jquery.js.

+0

Phiên bản câu hỏi này không được hỏi hàng ngàn lần? –

Trả lời

6

Bạn có thể sử dụng các sự kiện onload của yếu tố kịch bản đối với hầu hết các trình duyệt, và sử dụng một hàm callback:

Edit: Bạn có thể không thực sự đình chỉ thi hành các mã khi bạn tải tập lệnh theo cách này (và thực hiện các yêu cầu Ajax đồng bộ là một ý tưởng tồi tệ nhất trong các lần).

Nhưng bạn có thể callbacks chuỗi, vì vậy nếu bạn có một số mã mà phụ thuộc vào cả hai, Two.jsThree.js, bạn có thể chuỗi những hành động bốc, ví dụ:

loadScript('http://example.com/Two.js', function() { 
    // Two.js is already loaded here, get Three.js... 
    loadScript('http://example.com/Three.js', function() { 
    // Both, Two.js and Three.js loaded... 
    // you can place dependent code here... 
    }); 
}); 

Thực hiện:

function loadScript(url, callback) { 
    var head = document.getElementsByTagName("head")[0], 
     script = document.createElement("script"), 
     done = false; 

    script.src = url; 

    // Attach event handlers for all browsers 
    script.onload = script.onreadystatechange = function(){ 
    if (!done && (!this.readyState || // IE stuff... 
     this.readyState == "loaded" || this.readyState == "complete")) { 
     done = true; 
     callback(); // execute callback function 

     // Prevent memory leaks in IE 
     script.onload = script.onreadystatechange = null; 
     head.removeChild(script); 
    } 
    }; 
    head.appendChild(script); 
} 

Đối với IE, sự kiện onreadystatechange có bị ràng buộc.

+0

Tôi hơi bối rối, vì vậy tôi có nên sử dụng mã ở trên hoặc mã bạn đã liên kết không? – Henryh

+0

@ Henryh, Sử dụng mã tôi liên kết, nó là trình duyệt chéo, và nó sẽ làm việc mà không có vấn đề trên IE, nó thậm chí còn quan tâm đến một số [rò rỉ bộ nhớ] nổi tiếng (http://ajaxian.com/archives/dynamic-script -generation-and-memory-leaks), tôi không muốn * cross-post * nó ở đây ... – CMS

+0

okay, cảm ơn CMS. bạn có nhớ sau đó cập nhật mã của bạn ở trên để được giống như mã trên trang được liên kết. Nó sẽ làm cho nó ít gây nhầm lẫn cho những người tương lai biết mã nào để sử dụng. Cảm ơn một lần nữa. – Henryh

0

Tôi chỉ đọc CMS's answer và quyết định rằng từ nhận xét "hầu hết các trình duyệt" của mình, tôi có thể có lỗi khi làm việc cho những người không có chức năng này nguyên bản.

Về cơ bản, đó là khoảng thời gian mà cuộc thăm dò cho một biến.

var poll = window.setInterval(function() { 

    if (typeof myVar !== 'undefined') { 
     clearInterval(poll); 
     doSomething(); 
    }; 

}, 100); 
+2

Có, bởi * "hầu hết các trình duyệt" * Tôi thường tham khảo bất kỳ thứ gì không phải là IE :) – CMS

+0

@CMS Không chắc liệu câu trả lời của tôi có thêm bất cứ thứ gì sau đó không. Đó là một chút hacky, đặc biệt là nếu có lựa chọn thay thế tốt hơn. – alex

+0

tốt, cá nhân tôi không thích tính giờ để làm điều này loại công cụ khi bạn có thể sử dụng các sự kiện, tuy nhiên nó là một câu trả lời hoàn toàn hợp lệ ... – CMS

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