在运行javascript代码之前,如何使用jQuery.getScript()加载可变数量的脚本?

时间:2011-02-17 22:57:05

标签: javascript jquery

我需要在运行依赖于它们的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
});

由于

6 个答案:

答案 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