Câu trả lời là
Bạn có thể sử dụng lời hứa với getScript()
và đợi cho đến khi tất cả các tập lệnh được tải, đại loại như:
$.when(
$.getScript( "/mypath/myscript1.js" ),
$.getScript( "/mypath/myscript2.js" ),
$.getScript( "/mypath/myscript3.js" ),
$.Deferred(function( deferred ){
$( deferred.resolve );
})
).done(function(){
//place your code here, the scripts are all loaded
});
VĨ CẦM
KHÁC fiddle
Trong đoạn mã trên, việc thêm Trì hoãn và giải quyết nó bên trong $()
cũng giống như đặt bất kỳ hàm nào khác trong một lệnh gọi jQuery, giống như $(func)
, nó giống như
$(function() { func(); });
tức là nó chờ DOM sẵn sàng, vì vậy trong ví dụ trên, $.when
chờ tất cả các tập lệnh được tải và DOM sẵn sàng vì $.Deferred
cuộc gọi giải quyết trong cuộc gọi lại sẵn sàng của DOM.
Để sử dụng chung hơn, một chức năng tiện dụng
Một hàm tiện ích chấp nhận bất kỳ mảng script nào có thể được tạo như thế này:
$.getMultiScripts = function(arr, path) {
var _arr = $.map(arr, function(scr) {
return $.getScript( (path||"") + scr );
});
_arr.push($.Deferred(function( deferred ){
$( deferred.resolve );
}));
return $.when.apply($, _arr);
}
có thể được sử dụng như thế này
var script_arr = [
'myscript1.js',
'myscript2.js',
'myscript3.js'
];
$.getMultiScripts(script_arr, '/mypath/').done(function() {
// all scripts loaded
});
trong đó đường dẫn sẽ được thêm vào tất cả các tập lệnh và cũng là tùy chọn, nghĩa là nếu mảng chứa URL đầy đủ thì người ta cũng có thể làm điều này và bỏ qua đường dẫn cùng nhau
$.getMultiScripts(script_arr).done(function() { ...
Luận cứ, lỗi v.v.
Bên cạnh đó, lưu ý rằng cuộc done
gọi lại sẽ chứa một số đối số phù hợp với thông qua trong các tập lệnh, mỗi đối số đại diện cho một mảng chứa phản hồi
$.getMultiScripts(script_arr).done(function(response1, response2, response3) { ...
trong đó mỗi mảng sẽ chứa một cái gì đó như [content_of_file_loaded, status, xhr_object]
. Nói chung, chúng tôi không cần phải truy cập vào các đối số đó vì các tập lệnh sẽ được tải tự động bằng mọi cách và hầu hết thời gian done
gọi lại là tất cả chúng tôi thực sự sau khi biết rằng tất cả các tập lệnh đã được tải, tôi chỉ cần thêm nó cho đầy đủ và trong những trường hợp hiếm hoi khi văn bản thực tế từ tệp được tải cần được truy cập hoặc khi một người cần truy cập vào từng đối tượng XHR hoặc một cái gì đó tương tự.
Ngoài ra, nếu bất kỳ tập lệnh nào không tải được, trình xử lý lỗi sẽ được gọi và các tập lệnh tiếp theo sẽ không được tải
$.getMultiScripts(script_arr).done(function() {
// all done
}).fail(function(error) {
// one or more scripts failed to load
}).always(function() {
// always called, both on success and error
});
$.Deferred(function( deferred ){$( deferred.resolve );})
đây?