答えは
次のように、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
});
FIDDLE
アナザーFIDDLE
上記のコードでは、Deferredを追加して内部で解決するの$()
は、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 );})
ここに追加する理由を教えていただけませんか?