我需要在运行依赖于它们的javascript代码之前加载可变数量的javascript源文件。有时需要加载1个脚本,有时需要加载2. getScript()方法允许加载一个脚本 - 如何在运行内部代码之前使用它来加载x个脚本?
$.getScript("test.js", function(){ // code to run after script is loaded });
我需要什么:
$.getScript(new Array("1.js","2.js"), function(){ // code to run after all scripts are loaded });
由于
答案 0 :(得分:17)
如果您使用的是jquery 1.5,则可以使用新的延迟语法。
$.when(
$.getScript("1.js"),
$.getScript("2.js"),
$.getScript("3.js")
).then(function(){
alert("all loaded");
});
只需传入您要加载的脚本。
答案 1 :(得分:3)
我建议你研究一下LABjs
这正是它的目的。
答案 2 :(得分:2)
我非常广泛地使用RequireJS而且非常好。但是,这可能适合您:
$.getScript("1.js", function(){
$.getScript("2.js", function () {
// code to run after all scripts are loaded
});
});
这是一个非常讨厌的代码块,IMO,但如果它实际上只有两个这样的脚本,它可能是值得的。上面的逻辑也可以提取到一个通用函数,但是一旦你走得太远,那么使用RequireJS或LABjs建议JAAulde可能更聪明。
答案 3 :(得分:1)
一种方法是列出阵列中的所有脚本,跟踪已加载的脚本数量与要加载的数量。像这样:
var toLoad = ["1.js", "2.js", "3.js"], loaded = 0;
var onLoaded = function() {
loaded++;
if (loaded == toLoad.length) {
console.log('All scripts loaded!');
} else {
console.log('Not all scripts are loaded, waiting...');
}
}
for (var i = 0, len = toLoad.length; i < len; i++) {
$.getScript(toLoad[i], onLoaded);
}
答案 4 :(得分:0)
今晚早些时候写了这篇文章,但我保证我不是一个植物。 ;-)除了LabJS和RequireJS之外,还有Head.js,它使用简单,完全符合您的要求。
答案 5 :(得分:0)
依次按$ .getScript()加载多个脚本,并在加载所有脚本后执行操作
Working Fiddle。检查控制台窗口中的输出
我们可以创建一个传递js文件路径数组的函数,这个函数将为第一个js文件执行$.getScript()
,对于成功方法,它将通过传递第二个js文件索引来调用相同的函数,这个成功将通过传递第三个文件索引等来调用相同的函数,直到它加载最后一个文件。所以它基本上是一个递归函数,它会在数组中的所有文件都被加载时给出一个回调。结束代码就像
LoadAllScripts("yourArray",function(){
alert("all scripts loaded!!");
});
所以完整的代码会像这样。
var LoadAllScripts = function (scriptArray, callback) {
SyncLoadScript({ scriptArray: scriptArray, index: 0}, function () {
callback();
});
};
SyncLoadScript(core of the logic
)看起来像
var SyncLoadScript = function (scriptConfig, callback) {
var $this = this;
var script = scriptConfig.scriptArray[scriptConfig.index];
if (scriptConfig.scriptArray.length > scriptConfig.index) {
if (script.trim().length > 0) {
$.getScript(script, function () {
console.log(script);
SyncLoadScript({ scriptArray: scriptConfig.scriptArray, index: ++scriptConfig.index, element: scriptConfig.element }, callback);
}).fail(function (jqXHR, textStatus, errorThrown) {
console.log(script + " failed while loading");
debugger;
console.log("Error: "+errorThrown);
SyncLoadScript({ scriptArray: scriptConfig.scriptArray, index: ++scriptConfig.index, element: scriptConfig.element }, callback);
});
}
else {
console.log("invalid script src!!");
}
}
else {
callback();
}
}
然后,您可以通过传递js文件路径数组来对LoadAllScripts进行简单调用。如下。
LoadAllScripts(["1.js","2.js","3.js","4.js"], function () {
console.log("All the scripts have been loaded.");
//do your stuff after all the scripts are loaded.
});
注意:我已经为你们提供了空的回调来进行调整并传递任何选择的数据。 probably to hold all the failed scripts that you can passback to the main function and try to reload them again
。