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?$.ajaxSetup({ cache: true });
mais cela pourrait également affecter d'autres appels ajax que vous ne voulez pas mettre en cache, il y a beaucoup plus à ce sujet dans la documentation pour getScript , et il existe même un petit guide sur la création d'une fonction getScript mise en cache appelée cachedScript.$.when($.getScript(scriptSrc_1), $.getScript(scriptSrc_2), $.getScript(scriptSrc_3), $.getScript(scriptSrc_4), $.Deferred(function(deferred) { $(deferred.resolve); })).done(function() { ... })
J'ai implémenté une fonction simple pour charger plusieurs scripts en parallèle:
Fonction
Usage
la source
Chargez le script nécessaire suivant dans le rappel du précédent comme:
la source
Parfois, il est nécessaire de charger les scripts dans un ordre spécifique. Par exemple, jQuery doit être chargé avant l'interface utilisateur jQuery. La plupart des exemples de cette page chargent des scripts en parallèle (de manière asynchrone), ce qui signifie que l'ordre d'exécution n'est pas garanti. Sans commande, script
y
qui dépend dex
pourrait se casser si les deux sont correctement chargés mais dans le mauvais ordre.Je propose une approche hybride qui permet le chargement séquentiel de scripts dépendants + chargement parallèle optionnel + objets différés :
Les scripts des deux files d'attente seront téléchargés en parallèle, cependant, les scripts de chaque file d'attente seront téléchargés en séquence, garantissant une exécution ordonnée. Graphique en cascade:
la source
Utilisez yepnope.js ou Modernizr (qui inclut yepnope.js comme
Modernizr.load
).METTRE À JOUR
Juste pour faire un suivi, voici un bon équivalent de ce que vous utilisez actuellement avec yepnope, montrant les dépendances sur plusieurs scripts:
la source
yepnope.injectJs( scriptSource )
au début de mon fichier javascript, tout comme inclure des<script>
balises dans un fichier html?$.getScript
. Ceci est une grosse affaire.J'ai rencontré un certain nombre de problèmes avec le chargement de plusieurs scripts inculquant un problème avec (au moins dans Chrome) le chargement à chaud du même domaine de scripts ne fonctionnant pas réellement après avoir été chargés avec succès par Ajax où Cross Domain fonctionne parfaitement bien! :(
La réponse sélectionnée à la question d'origine ne fonctionne pas de manière fiable.
Après de nombreuses itérations, voici ma réponse finale à getScript (s) et au chargement asynchrone de plusieurs scripts dans un ordre strict spécifique avec une option de rappel chargée par script et un rappel global à la fin, Testé dans jQuery 2.1+ et les versions modernes de Chrome, Firefox plus le abandonné Internet Explorer.
Mon scénario de test chargeait des fichiers pour un rendu webGL THREE.JS, puis démarrait le script de rendu lorsque THREE global est devenu disponible en utilisant une vérification d'intervalle passée à un appel de fonction anonyme à onComplete.
La fonction Prototype (getScripts)
Comment utiliser
La fonction est la même que celle que j'ai trouvée en utilisant Deferred (obsolète maintenant?), When, Success & Complete dans mes essais pour NE PAS être fiable à 100%!?, D'où cette fonction et l'utilisation de statusCode par exemple.
Vous pouvez ajouter un comportement de gestion des erreurs / échecs si vous le souhaitez.
la source
Vous pouvez utiliser la
$.when
méthode-en essayant la fonction suivante:Cette fonction serait utilisée comme ceci:
C'est la façon d'utiliser Promises et d'avoir un minimum de frais généraux.
la source
Excellente réponse, adeneo.
Il m'a fallu un peu de temps pour comprendre comment rendre votre réponse plus générique (afin que je puisse charger un tableau de scripts définis par le code). Le rappel est appelé lorsque tous les scripts sont chargés et exécutés. Voici ma solution:
la source
Ajouter des scripts avec async = false
Voici une approche différente, mais super simple. Pour charger plusieurs scripts, vous pouvez simplement les ajouter au corps.
Plus d'informations ici: https://www.html5rocks.com/en/tutorials/speed/script-loading/
la source
Ce que vous recherchez, c'est un chargeur compatible AMD (comme require.js).
http://requirejs.org/
http://requirejs.org/docs/whyamd.html
Il y en a beaucoup de bons open source si vous le recherchez. Fondamentalement, cela vous permet de définir un module de code, et s'il dépend d'autres modules de code, il attendra que ces modules aient fini de télécharger avant de continuer à s'exécuter. De cette façon, vous pouvez charger 10 modules de manière asynchrone et il ne devrait y avoir aucun problème même si l'un dépend de quelques-uns des autres à exécuter.
la source
Cette fonction s'assurera qu'un fichier est chargé une fois le fichier de dépendance complètement chargé. Il vous suffit de fournir les fichiers dans une séquence en gardant à l'esprit les dépendances sur d'autres fichiers.
la source
Cela fonctionne pour moi:
Et utilisez-le:
la source
Voici la réponse en utilisant celle de Maciej Sawicki et en l'implémentant
Promise
comme rappel:Utilisation:
Tous les fichiers Javascript sont téléchargés dès que possible et exécutés dans l'ordre indiqué. Puis
taskNeedingParameters
est appelé.la source
Version plus courte de la réponse complète d'Andrew Marc Newton ci-dessus. Celui-ci ne vérifie pas le code d'état pour la réussite, ce que vous devez faire pour éviter un comportement d'interface utilisateur non défini.
Celui-ci était destiné à un système ennuyeux où je pouvais garantir jQuery mais pas d'autres inclus, donc je voulais une technique suffisamment courte pour ne pas être transformée en script externe si elle y était forcée. (Vous pourriez le rendre encore plus court en passant l'indice 0 au premier appel "récursif" mais la force des habitudes de style m'a fait ajouter le sucre).
J'attribue également la liste de dépendances à un nom de module, donc ce bloc peut être inclus partout où vous avez besoin de "module1" et les scripts et l'initialisation dépendante ne seront inclus / exécutés qu'une seule fois (vous pouvez vous connecter
index
au rappel et voir un seul commandé ensemble de requêtes AJAX exécutées)la source
Il existe un plugin qui étend la méthode getScript de jQuery. Permet le chargement asynchrone et synchrone et utilise le mécanisme de mise en cache de jQuery. Divulgation complète, j'ai écrit ceci. N'hésitez pas à contribuer si vous trouvez une meilleure méthode.
https://github.com/hudsonfoo/jquery-getscripts
la source
Charge n scripts un par un (utile si par exemple le 2ème fichier a besoin du 1er):
la source
basé sur la réponse de @adeneo ci-dessus: Combinaison du chargement de fichiers css et js
des suggestions d'améliorations ??
la source
Vous pouvez essayer ceci en utilisant la récursivité. Cela les téléchargera en synchronisation, l'un après l'autre jusqu'à ce qu'il termine le téléchargement de la liste entière.
la source