La réponse est
Vous pouvez utiliser des promesses avec getScript()
et attendre que tous les scripts soient chargés, quelque chose comme:
$.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
});
VIOLON
UN AUTRE VIOLON
Dans le code ci-dessus, ajouter un Deferred et le résoudre à l'intérieur $()
revient à placer n'importe quelle autre fonction dans un appel jQuery, comme $(func)
, c'est la même chose que
$(function() { func(); });
c'est-à-dire qu'il attend que le DOM soit prêt, donc dans l'exemple ci-dessus $.when
attend que tous les scripts soient chargés et que le DOM soit prêt à cause de l' $.Deferred
appel qui se résout dans le rappel DOM ready.
Pour une utilisation plus générique, une fonction pratique
Une fonction utilitaire qui accepte n'importe quel tableau de scripts pourrait être créée comme ceci:
$.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);
}
qui peut être utilisé comme ça
var script_arr = [
'myscript1.js',
'myscript2.js',
'myscript3.js'
];
$.getMultiScripts(script_arr, '/mypath/').done(function() {
// all scripts loaded
});
où le chemin sera ajouté au début de tous les scripts, et est également facultatif, ce qui signifie que si le tableau contient l'URL complète, on peut également le faire, et omettre le chemin tous ensemble
$.getMultiScripts(script_arr).done(function() { ...
Arguments, erreurs, etc.
En done
passant , notez que le callback contiendra un certain nombre d'arguments correspondant aux scripts passés, chaque argument représentant un tableau contenant la réponse
$.getMultiScripts(script_arr).done(function(response1, response2, response3) { ...
où chaque tableau contiendra quelque chose comme [content_of_file_loaded, status, xhr_object]
. Nous n'avons généralement pas besoin d'accéder à ces arguments car les scripts seront de toute façon chargés automatiquement, et la plupart du tempsdone
rappel est tout ce que nous recherchons vraiment pour savoir que tous les scripts ont été chargés, je l'ajoute juste pour être complet , et pour les rares occasions où le texte réel du fichier chargé doit être accédé, ou lorsque l'on a besoin d'accéder à chaque objet XHR ou quelque chose de similaire.
De plus, si l'un des scripts ne parvient pas à se charger, le gestionnaire d'échec sera appelé et les scripts suivants ne seront pas chargés
$.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 );})
ici?