Điều tôi đang cố gắng thực hiện bao gồm một hoặc nhiều tệp js từ bên trong Javascript. Tôi biết có một loạt các kỹ thuật cho việc này, nhưng tôi đang tìm một giải pháp tuân theo các quy tắc sau:Tự động bao gồm JavaScript và đợi
1) Không sử dụng bất kỳ khung công tác hoặc thư viện JS nào (jQuery, Prototype, v.v.).
2) Tập lệnh phải tạm dừng thực thi cho đến khi tệp js bên ngoài được tải hoàn toàn và phân tích cú pháp bởi trình duyệt.
Lý do đằng sau # 2 là tệp js bên ngoài sẽ bao gồm các định nghĩa hàm cần được sử dụng ngay sau khi tập lệnh được bao gồm. Hầu hết thời gian trình duyệt không có thời gian để phân tích cú pháp tệp js trước khi tôi bắt đầu gọi các hàm đó.
Tôi không quan tâm sử dụng một callback để biết khi kịch bản được tải xong, nhưng:
1) Tôi không biết trước thời hạn bao nhiêu kịch bản sẽ được bao gồm tự động, vì vậy tôi don không muốn và không thể viết một loạt các callbacks lồng nhau. Tôi chỉ cần biết khi nào họ tải xong.
2) Tôi đang nói rằng cố gắng sử dụng một số loại "tải" sự kiện để kích hoạt tính năng gọi lại có thể không hoạt động nếu trình duyệt đã lưu trong bộ nhớ cache JavaScript.
Chỉnh sửa Tôi đã đề cập từ đầu rằng đây là dành cho hệ thống plugin nhưng tôi muốn giữ cho câu hỏi/câu trả lời của tôi đủ chung để giúp ích cho người khác.
Người dùng sẽ xác định trình cắm nào họ muốn tải trong một mảng.
plugins = [ 'FooPlugin', 'BarPlugin' ];
tôi sẽ sau đó lặp qua mảng, và tải các script js cho mỗi plugin:
for(var i = 0; i < plugins.length; i++) {
loadScript('plugins/' + plugins[i] + '.js');
}
Mỗi Plugin đẩy bản thân vào mảng loaded_plugins (Đây là một ví dụ về FooPlugin.js)
load_plugins.push({
name: 'FooPlugin',
// Other plugin methods and properties here
});
Không chắc chắn về câu trả lời này, do đó, chỉ cần đăng nó như một bình luận. Bạn đã thử sử dụng AJAX để tải nội dung của javascript vào biến phía máy khách, sau đó sử dụng 'eval()'? Vì bạn phải đợi AJAX trả về một thông báo 200/OK, bạn biết toàn bộ kịch bản đã được nạp, và 'eval()' không nên đưa bạn đến dòng kế tiếp cho đến khi nó chạy xong toàn bộ tập lệnh. – stevendesu
Bạn có thể xác định tập lệnh nào cần thiết trong khi tải trang không? Nếu vậy, thì giải pháp của @ Paul là lý tưởng. Nếu không, giải pháp của bạn sẽ tùy thuộc vào trình duyệt nào bạn muốn hỗ trợ và liệu các tập lệnh có nằm trong cùng một tên miền với trang của bạn hay không. –
@steven_desu - Các hàm/biến trong kịch bản được nạp có kết thúc trong ngữ cảnh mà eval() được gọi không? Có nghĩa là họ sẽ không có sẵn bên ngoài chức năng sử dụng eval. – mellowsoon