动态导入js引发的问题

比较常见的用于动态导入js的方法有以下两种:

//方法一   
document.write("<script language=\"JavaScript\" type=\"text/javascript\" src=\"t.js\"><\/script>");   
  
//方法二   
var script = document.createElement("script");   
script.src = "t.js";   
script.type = "text/javascript";   
document.getElementsByTagName("head").item(0).appendChild(script);   

 

今天做动态导入时发现了问题,t.js内容如下:

function M(){alert("m");}  

 调用代码: 

document.write("<script language=\"JavaScript\" type=\"text/javascript\" src=\"t.js\"><\/script>");   
M();  

 脚本出错,提示缺少对象(使用方法二也有同样的问题)。为了说明问题,我们稍做修改,t.js内容如下: 

function M(){alert("m");}   
alert("t.js");  

 

调用代码:

document.write("<script language=\"JavaScript\" type=\"text/javascript\" src=\"t.js\"><\/script>");   
alert("index.htm");   

 

可以看到,是先弹出"index.htm",再弹出"t.js",这说明t.js的导入是在页面脚本执行完后进行的,在执行M()时,M函数还未声明,因而报错。解决方法:

<script>   
function bar(u) {   
    var x=window.ActiveXObject?new ActiveXObject("MSXML2.XMLHTTP"):new XMLHttpRequest();   
    x.open("GET",u,false);   
    x.send(null);   
    s=x.responseText;   
    try {window.execScript(s)}catch(ex){window.eval(s)};//Mozilla下window.eval大致与IE的window.execScript方法功能相同   
}   
bar("t.js");   
M();   
</script>   

 

采用上边方法的不足是:当index.htm和t.js不在同一台服务器上时,index.htm脚本执行会出错,提示没有权限。下边代码摘自QQ首页,测试通过:

<script type="text/javascript">   
var MiniSite=new Object();   
MiniSite.Browser={   
    ie:/msie/.test(window.navigator.userAgent.toLowerCase()),   
    moz:/gecko/.test(window.navigator.userAgent.toLowerCase()),   
    opera:/opera/.test(window.navigator.userAgent.toLowerCase()),   
    safari:/safari/.test(window.navigator.userAgent.toLowerCase())   
};   
MiniSite.JsLoader={   
    load:function(sUrl,fCallback){   
        var _script=document.createElement('script');   
        _script.setAttribute('charset','gb2312');   
        _script.setAttribute('type','text/javascript');   
        _script.setAttribute('src',sUrl);   
        document.getElementsByTagName('head')[0].appendChild(_script);   
        if(MiniSite.Browser.ie){   
            _script.onreadystatechange=function(){   
                if(this.readyState=='loaded'||this.readyStaate=='complete'){   
                    fCallback();   
                }   
            };   
        }else if(MiniSite.Browser.moz){   
            _script.οnlοad=function(){   
                fCallback();   
            };   
        }else{   
            fCallback();   
        }   
    }   
};   
  
MiniSite.JsLoader.load("http://www.mzwu.com/t.js",function(){M();});   
</script>   
  

 

 原文地址: http://www.ai-java.com/entry/117

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值