需求可能比较诡异。就是引用一个a.js文件里会引用另一个b.js文件,而且要求被引用的b.js文件中的代码先执行,然后再执行a.js余下的代码。因为需要执行的js比较多,之间有一些依赖关系,人肉整理太麻烦了。目测用异步的东东是可以弄的。

解决方案 »

  1.   

    这样可以按顺序加载loadScript("file1.js", function(){
    loadScript("file2.js", function(){
    loadScript("file3.js", function(){
    alert("All files are loaded!");
    });
    });
    });
    function loadScript(url, callback){
    var script = document.createElement ("script")
    script.type = "text/javascript";
    if (script.readyState){ //IE
    script.onreadystatechange = function(){
    if (script.readyState == "loaded" || script.readyState == "complete"){
    script.onreadystatechange = null;
    callback();
    }
    };
    } else { //Others
    script.onload = function(){
    callback();
    };
    }
    script.src = url;
    document.getElementsByTagName_r("head")[0].appendChild(script);
    }
      

  2.   


    非常感谢,我明白你的意思了,不过刚才测了下似乎有点不大对,能看下吗?
    我一共有4个js文件1引用2-1和2-2,2-1和2-2都引用3//1.js
    alert('1begin');
    loadScript("2-1.js", function(){
    loadScript("2-2.js", function(){
    alert("1end");
    });
    });
    //2-1.js
    alert("2-1begin");
    loadScript("3.js", function(){
    alert("2-1end");
    });
    //2-2.js
    alert("2-2begin");
    loadScript("3.js", function(){
    alert("2-2end");
    });
    //3.js
    alert(3);输出是//Chrome23
    1begin
    2-1begin
    3
    2-1end
    2-2begin
    1end
    3
    2-2end1end应该是最后输出的才对吧。
      

  3.   

    这样就对了,你加载完最后一个就不要callback()了
      

  4.   


        if (script.readyState) { //IE
            script.onreadystatechange = function() {
                if (script.readyState == "loaded" || script.readyState == "complete") {
                    script.onreadystatechange = null;
                    callback();
                }
            };
        } else { //Others
            script.onload = function() {
                callback();
            };
        }看上面代码,意思说加载完“2-1.js”就callback()加载“2-2.js”,这时候“2-1.js”加载完了应该就运行,那就会弹出3。那加载“2-2.js”完成了,那又不是要运行callback()?这时候的就应该会运行alert("1end"),而“2-2.js”加载完运行了。
      

  5.   

    有无研究过AMD规范?,比较流行的有Requirejs和Seajs,都挺成熟了。
      

  6.   


    对不起,我只是个JS新手,没研究过。RequireJS试了下,似乎也和前面一样,加载顺序正确,执行顺序不太一致
      

  7.   

    在加载顺序的基础上,你还要自己指定回调保证执行顺序。如果依赖逻辑过多造成回调层次过深,你还可以试试老赵的Windjs,用同步思维写异步代码