答えは
でpromiseを使用して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
});
フィドル
別のフィドル</p>
上記のコードでは、Deferredを追加して内部で解決すること$()
は、jQuery呼び出し内に他の関数を配置することと同じです。たとえば$(func)
、と同じです。
$(function() { func(); });
つまり、DOMの準備が整うのを$.when
待つため、上記の例では、すべてのスクリプトが読み込まれ$.Deferred
、DOMの準備ができたコールバックで解決される呼び出しのために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
});