Javascript多重动态插入

Javascript多重动态插入,javascript,dynamic,recursion,onload,insertion,Javascript,Dynamic,Recursion,Onload,Insertion,当我们为javascript进行动态插入时,有时顺序很重要。我们有时通过使用onload属性来解决这个问题;然而,如果有许多外部Java脚本,并且这些脚本必须按顺序加载,那么我们应该怎么做 我通过递归定义的onload函数解决了这个问题;然而,我对效率不是很确定。。。由于这是一个脚本,我认为它可以进行惰性评估。。。。有什么帮助吗 //recursively create external javascript loading chain //cautiously add url list acc

当我们为javascript进行动态插入时,有时顺序很重要。我们有时通过使用onload属性来解决这个问题;然而,如果有许多外部Java脚本,并且这些脚本必须按顺序加载,那么我们应该怎么做

我通过递归定义的onload函数解决了这个问题;然而,我对效率不是很确定。。。由于这是一个脚本,我认为它可以进行惰性评估。。。。有什么帮助吗

//recursively create external javascript loading chain
//cautiously add url list according to the loading order
//this function takes a list of urls of external javascript
function loadScript(url) {
  if( url.length == 0) {
    //final function to execute
    return FUNCTION;
  }

  var f = function(){
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = url.pop();

    //recursion
    script.onload = loadScript(url) ;
    document.getElementsByTagName("head")[0].appendChild(script);
  }
  return f;
}

function loadScripts(urls) {
  var script = document.createElement("script");
  script.type = "text/javascript";
  script.src = urls.pop();
  script.onload = loadScript(urls) ;
  document.getElementsByTagName("head")[0];.appendChild(script);
}

loadScripts(["aaa.js","bbb.js","ccc.js"]);
谢谢大家!


-对不起,把你弄糊涂了。。我添加了一个实际调用loadScript()的函数。(我检查了这个功能。)

为什么不按正确的顺序将链接添加到javascript中,然后开始使用像jQuery这样的javascript库?

有一种方法可以使用。
看看这个链接,演示就是它。

我不知道如何使用这个loadScript函数,看起来比它可能需要的要混乱得多

如果您想按顺序加载脚本,为什么不按您想加载的顺序列出它们,然后加载第一个呢。加载完成后,更新列表以删除刚加载的列表并加载下一个列表,等等

下面是一些可以做到这一点的代码,这些代码应该与浏览器使用的脚本加载检测机制一起工作,并将一直等到调用onload函数(或readystatechange通知),直到加载下一个脚本:

function loadScriptsSequential(scriptsToLoad) {

    function loadNextScript() {
        var done = false;
        var head = document.getElementsByTagName('head')[0];
        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.onreadystatechange = function () {
            if (this.readyState == 'complete' || this.readyState == 'loaded') {
                scriptLoaded();
            }
        }
        script.onload = scriptLoaded;
        script.src = scriptsToLoad.shift(); // grab next script off front of array
        head.appendChild(script);

        function scriptLoaded() {
            // check done variable to make sure we aren't getting notified more than once on the same script
            if (!done) {
                script.onreadystatechange = script.onload = null;   // kill memory leak in IE
                done = true;
                if (scriptsToLoad.length != 0) {
                    loadNextScript();
                }
            }
        }
    }

    loadNextScript();
}

var scripts = [a,b,c,d,e,f];        // scripts to load in sequential order
loadScriptsSequential(scripts);

正如其他人所提到的,有一些非常有用的框架(如jQuery)具有用于加载脚本的内置函数。

我添加了一行代码,实际上调用了加载脚本。。。很抱歉造成混淆,谢谢您的评论。您是否考虑过使用现成的加载程序(如requireJS)或支持模块的JS框架(如Dojo)?