首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步加载js脚本-确保它们按正确的顺序加载。

异步加载js脚本-确保它们按正确的顺序加载。
EN

Stack Overflow用户
提问于 2014-06-17 16:19:38
回答 2查看 349关注 0票数 2

我试图异步加载js文件,代码如下:

代码语言:javascript
复制
function load_js() {
    var scripts = [
        'http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js',
        'http://code.jquery.com/ui/1.10.2/jquery-ui.min.js',
        '/js/libs/joose.min.js',
        '/js/observer.js',
        '/js/resume-library.js'
    ];

    for( var i = 0; i < scripts.length; i++){
        var element = document.createElement("script");
        element.src = scripts[i];
        document.body.appendChild(element);
    }
}
if (window.addEventListener)
    window.addEventListener("load", load_js, false);
else if (window.attachEvent)
    window.attachEvent("onload", load_js);
else window.onload = load_js;

但是,顺序并不总是遵循数组的顺序,有时加载文件可能需要更长的时间等。

如何保证文件将按数组的顺序加载?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-17 16:39:41

尝尝这个。它使用来自http://msdn.microsoft.com/en-us/library/ie/hh180173%28v=vs.85%29.aspx的方法来附加到脚本加载后调用的事件。

代码语言:javascript
复制
function load_js() {
    var scripts = [
        'http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js',
        'http://code.jquery.com/ui/1.10.2/jquery-ui.min.js',
        '/js/libs/joose.min.js',
        '/js/observer.js',
        '/js/resume-library.js'
    ];


    function loadNext(){
        var src = scripts.shift();
        if (typeof src === 'undefined')
           return;

        var s = document.createElement("script");

        s.src=src;
        if(s.addEventListener) {
          s.addEventListener("load",loadNext,false);
        } 
        else if(s.readyState) {
          s.onreadystatechange = loadNext;
        }
        document.body.appendChild(s);
       }
    }

   loadNext();
}
票数 1
EN

Stack Overflow用户

发布于 2014-06-17 16:37:27

这不是经过测试的,但应该是解决办法,

我创建了一个设置src并追加脚本并触发回调的函数,然后只有在回调触发时才会继续遍历脚本,因此这种方式应该是相同的顺序。

代码语言:javascript
复制
function appendScript(src,callback){
        var element = document.createElement("script");
       element.src = src;
       document.body.appendChild(element);

       element.onload=function(){
        callback();
       }
}


var i = 0;
var loopScripts = function(scripts) {
    appendScript(scripts[i],function(){
        // set i to next item when callback gets called
        i++;

        // any more items in array? continue loop
        if(i < scripts.length) {
            loopScripts(scripts);   
        }
    }); 
}



function load_js() {
   var scripts = [
       'http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js',
       'http://code.jquery.com/ui/1.10.2/jquery-ui.min.js',
       '/js/libs/joose.min.js',
       '/js/observer.js',
       '/js/resume-library.js'
   ];

   //start the loop
   loopScripts(scripts);
}

测试过了,这个很好用!但是,如果脚本不可用,则需要实现->,因为循环不会继续。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24268791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档