我在a.js中当文档加载完毕后动态加载其他需要的js文件,加载文件和方法如下var dHeader = document.getElementsByTagName( "head" )[0];
//for循环
elem = document.createElement("link");
elem.setAttribute("rel", "stylesheet");
elem.setAttribute("type", "text/css");
elem.setAttribute("href",  srcs[i]);
dHeader.appendChild(elem);
//dynamicInclude(['jquery.js', 'user.js']);user.js会用到jQuery对象,比如在user.js的第一行 定义 var alias = jQuery;问题是:
    执行页面完成时,多数时候功能正常,多刷新几次偶尔控制台报alias = jQuery中jQuery未定义的错误
感觉jquery.js和user.js都是异步执行的,搜了下说可以用ansyc和defer属性进行控制,但我试了无论怎么设置这个属性问题依然存在
    求指教!!!

解决方案 »

  1.   

    楼主可以搜下 js动态加载
    参考下
    http://www.cnblogs.com/jimtomjim/archive/2010/04/01/1702106.html
    再贴个自己封装的
    Cme.loader.js;(function(w){
    var loader = function(){
    var dc = document;
    function createScript(url, callback){
    var urls = url,
    scripts = [],
    completed = 0;
    for( var i = 0, len = urls.length; i < len; i++ ){
    scripts[i] = dc.createElement('script');
    scripts[i].src = urls[i];
    dc.getElementsByTagName('head')[0].appendChild(scripts[i]);
    if( scripts[i].readyState ){ //ie
    scripts[i].onreadystatechange = function(){
    if( this.readyState == 'complete' || this.readyState == 'loaded' ){
    this.onreadystatechange = null; //确保事件不被处理2次
    completed++;
    completed >= urls.length ? callback() : '';
    }
    }
    }else{ //not ie
    scripts[i].onload = function(){
    completed++;
    completed >= urls.length ? callback() : '';
    }
    }
    }
    }
    function createLink(url, callback){
    var urls = url,
    links = [];
    for( var i = 0, len = urls.length; i < len; i++ ){
    links[i] = dc.createElement('link');
    links[i].rel = 'stylesheet';
    links[i].href = urls[i];
    dc.getElementsByTagName('head')[0].appendChild(links[i]);
    }
    callback();
    }
    return {
    load: function(option, callback){
    var _type = option.type || 'js',
    _url = option.url,
    _callback = callback || function(){};
    switch( _type ){
    case 'js':
    case 'javascript':
    createScript(_url, _callback);
    break;
    case 'css':
    createLink(_url, _callback);
    break;
    }
    return this;
    }
    }
    }();
    w.Cme ? '' : w.Cme = {};
    w.Cme.loader = loader;
    })(window);
    test.html<!DOCTYPE HTML>
    <html>
    <head>
    <meta charset="gb2312" />
    <title></title>
    <style>
    </style>
    <script src="Cme.loader.js"></script>
    </head>
    <body>
    123
    <script>
    Cme.loader.load({
    type: 'css',
    url: [
    'http://yui.yahooapis.com/2.9.0/build/reset/reset-min.css',
    'http://community.csdn.net/ui/homepage/css/index.css'
    ]
    },function(){
    alert('css加载完成')
    }).load({
    type: 'js',
    url: [
    'http://code.jquery.com/jquery-latest.js'
    ]
    },function(){
    alert( $ );
    })
    </script>
    </body>
    </html>
      

  2.   

    <script src=".."></script>
    这样会阻塞页面的加载比如
    <script src="jquery.js"></script>
    <script src="testFN.js"></script>
    那么页面会等jquery加载完毕后再加载testFN.js
    这样就产生了依赖顺行.
    详细的 楼主 可以 参考
    http://www.slideshare.net/itchina110/labjs-7895837
      

  3.   

    <script src=".."></script>
    这样会阻塞页面的加载比如
    <script src="jquery.js"></script>
    <script src="testFN.js"></script>
    那么页面会等jquery加载完毕后再加载testFN.js
    这样就产生了依赖顺行.
    详细的 楼主 可以 参考
    http://www.slideshare.net/itchina110/labjs-7895837
      

  4.   

    http://www.chhblog.com/Web/ArticleView.aspx?ArticleID=192
      

  5.   

    http://www.chhblog.com/Web/ArticleView.aspx?ArticleID=192
      

  6.   

    dynamicInclude(['jquery.js', 'user.js']);
    别用异步的呗。
    <script src='jquery.js'></script>
    <script src='user.js'></script>
    如果非要用到代码中,请参考动态加载js
    document.createElement然后用事件判断readyState是否加载完成再加载下一个
      

  7.   

    ++
    ansyc和defer各浏览器实现肯定不兼容