A resposta é
Você pode usar promessas com getScript()
e aguardar até que todos os scripts sejam carregados, algo como:
$.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
OUTRO FIDDLE
No código acima, adicionar um adiado e resolvê-lo $()
é como colocar qualquer outra função dentro de uma chamada jQuery, como $(func)
é o mesmo que
$(function() { func(); });
ou seja, ele espera o DOM estar pronto, portanto, no exemplo acima, $.when
espera que todos os scripts sejam carregados e o DOM esteja pronto devido à $.Deferred
chamada que é resolvida no retorno de chamada pronto do DOM.
Para uso mais genérico, uma função útil
Uma função utilitária que aceita qualquer matriz de scripts pode ser criada assim:
$.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);
}
que pode ser usado assim
var script_arr = [
'myscript1.js',
'myscript2.js',
'myscript3.js'
];
$.getMultiScripts(script_arr, '/mypath/').done(function() {
// all scripts loaded
});
onde o caminho será anexado a todos os scripts e também é opcional, o que significa que, se a matriz contiver o URL completo, também será possível fazer isso e deixar o caminho todo junto
$.getMultiScripts(script_arr).done(function() { ...
Argumentos, erros etc.
Como um aparte, observe que o done
retorno de chamada conterá vários argumentos correspondentes aos scripts passados, cada argumento representando uma matriz que contém a resposta
$.getMultiScripts(script_arr).done(function(response1, response2, response3) { ...
onde cada matriz conterá algo como [content_of_file_loaded, status, xhr_object]
. Geralmente, não precisamos acessar esses argumentos, pois os scripts serão carregados automaticamente de qualquer maneira, e na maioria das vezes o done
retorno de chamada é tudo o que realmente precisamos saber para saber que todos os scripts foram carregados, estou apenas adicionando-o para completar e nas raras ocasiões em que o texto real do arquivo carregado precisa ser acessado ou quando é necessário acessar cada objeto XHR ou algo semelhante.
Além disso, se algum dos scripts falhar ao carregar, o manipulador de falhas será chamado e os scripts subsequentes não serão carregados
$.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 );})
aqui?