视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
IE8中动态创建script标签onload无效的解决方法_javascript技巧
2020-11-27 21:30:38 责编:小采
文档


本文实例讲述了IE8中动态创建script标签onload无效的解决方法。分享给大家供大家参考。具体分析如下:

今天做项目,发现一个奇怪的问题,动态创建的script标签在IE8下无法触发onload事件。

代码如下:
代码如下:var loadJs = function(src, fun){
var script = null;
script = document.createElement("script");
script.type = "text/javascript";
script.src = src;
if(typeof fun === "function"){
script.onload = fun;
}

document.getElementsByTagName("head")[0].appendChild(script);
};

loadJs("js/jquery-1.11.0.min.js", function(){
console.log("From jQuery");
});

loadJs("test.js", function(){
console.log("From test.js");
});
test.js:
console.log(typeof jQuery);
运行结果:
代码如下:undefined // test.js运行时,jQuery还未加载
>> typeof jQuery // 从控制台上运行,却找到了jQuery对象,证明加载顺序问题
"function"
并且以上代码中script.onload并没有执行,明明代码已经加载进来了,为什么还是onload不执行呢?到网上一查发现众多前端开发人员都遇到这个棘手的问题,于是找到了一些替补方案,如下:
代码如下:var loadJs = function(src, fun){
var script = null;
script = document.createElement("script");
script.type = "text/javascript";
script.src = src;
if(typeof fun === "function"){
script.onreadystatechange = function() {
var r = script.readyState;
console.log(src + ": " + r);
if (r === 'loaded' || r === 'complete') {
script.onreadystatechange = null;
fun();
}
};
}

document.getElementsByTagName("head")[0].appendChild(script);
};
执行结果:
代码如下:undefined
js/jquery-1.11.0.min.js: loading
test.js: complete
From test.js
js/jquery-1.11.0.min.js: loaded
From jQuery
执行步骤为,这下类似于onload的功能算然算是找到了,但却有一个问题,它不是按顺序加载的,当jQuery文件loading的时候,test.js已经complete了,并且第一行就先执行了test.js的内容。因为test.js先于jQuery执行,所以才打出undefined。于是我们可以改写成这样,让它线性加载:
代码如下:loadJs("js/jquery-1.11.0.min.js", function(){

console.log("From jQuery");

loadJs("test.js", function(){
console.log("From test.js");
});
});
执行结果:
代码如下:js/jquery-1.11.0.min.js: loading
js/jquery-1.11.0.min.js: loaded
From jQuery
function
test.js: complete
From test.js
这次,执行的顺序完全是按照我们预订的顺序来了,但以上代码看着很别扭,需要层层嵌套,于是又发现了这种写法:
代码如下:var loadJs = function(src, fun){
var script = null;
script = document.createElement("script");
script.type = "text/javascript";
script.src = src;
if(typeof fun === "function"){
script.onreadystatechange = function() {
var r = script.readyState;
console.log(src + ": " + r);
if (r === 'loaded' || r === 'complete') {
script.onreadystatechange = null;
fun();
}
};
}

document.write(script.outerHTML);
//document.getElementsByTagName("head")[0].appendChild(script);

};

loadJs("js/jquery-1.11.0.min.js", function(){
console.log("From jQuery");
});

loadJs("test.js", function(){
console.log("From test.js");
});
执行结果的顺序,也不相同:
代码如下:function
js/jquery-1.11.0.min.js: loaded
From jQuery
test.js: loaded
From test.js
如果你改变一下加载顺序
代码如下:loadJs("test.js", function(){
console.log("From test.js");
});

loadJs("js/jquery-1.11.0.min.js", function(){
console.log("From jQuery");
});
执行结果也就不一样,类似顺序加载:
代码如下:undefined
test.js: loaded
From test.js
js/jquery-1.11.0.min.js: loaded
From jQuery

希望本文所述对大家的javascript程序设计有所帮助。

下载本文
显示全文
专题