Відповідь така
Ви можете використовувати обіцянки getScript()
і чекати, поки всі сценарії завантажуються, як-от:
$.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
});
ПІДМОГА
ДРУГИЙ FIDDLE
У наведеному вище коді додавання відкладеного і вирішення його всередині $()
- це як розміщення будь-якої іншої функції всередині дзвінка jQuery, наприклад $(func)
, це те саме, що
$(function() { func(); });
тобто він чекає, коли DOM буде готовий, тому у наведеному вище прикладі $.when
чекає завантаження всіх сценаріїв і DOM, щоб він був готовий через $.Deferred
виклик, який вирішується в зворотному звороті DOM.
Для більш загального використання зручна функція
Функція утиліти, яка приймає будь-який масив сценаріїв, може бути створена так:
$.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);
}
які можна використовувати так
var script_arr = [
'myscript1.js',
'myscript2.js',
'myscript3.js'
];
$.getMultiScripts(script_arr, '/mypath/').done(function() {
// all scripts loaded
});
де шлях буде попередньо призначений для всіх сценаріїв, а також є необов'язковим, це означає, що якщо масив містить повну URL-адресу, це також може зробити це, і залишити шлях усі разом
$.getMultiScripts(script_arr).done(function() { ...
Аргументи, помилки тощо.
Зауважте, що done
зворотний виклик буде містити ряд аргументів, що відповідають переданим у скриптах, кожен аргумент представляє масив, що містить відповідь
$.getMultiScripts(script_arr).done(function(response1, response2, response3) { ...
де кожен масив буде містити щось на зразок [content_of_file_loaded, status, xhr_object]
. Як правило, нам не потрібно отримувати доступ до цих аргументів, оскільки сценарії все одно завантажуватимуться автоматично, і більшість випадків done
зворотного виклику - це все, що ми насправді знаємо, що всі сценарії завантажені, я просто додаю його для повноти , і для рідкісних випадків, коли потрібен доступ до фактичного тексту із завантаженого файлу, або коли потрібен доступ до кожного об'єкта XHR або чогось подібного.
Крім того, якщо будь-який із скриптів не завантажується, буде викликано обробник несправності, а наступні сценарії не завантажуватимуться
$.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 );})
сюди?