IE8中动态创建script标签onload无效的解决方法


Posted in Javascript onDecember 22, 2014

本文实例讲述了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程序设计有所帮助。

Javascript 相关文章推荐
javascript学习网址备忘
May 29 Javascript
jquery调用wcf并展示出数据的方法
Jul 07 Javascript
window.event快达到全浏览器支持了,以后使用就方便了
Nov 30 Javascript
JScript分割字符串示例代码
Sep 04 Javascript
JQuery实现鼠标滑过显示导航下拉列表
Sep 12 Javascript
解析JavaScript中的不可见数据类型
Dec 02 Javascript
浅析tr的隐藏和显示问题
Mar 05 Javascript
JavaScript获取文本框内选中文本的方法
Feb 20 Javascript
简单谈谈javascript中的变量、作用域和内存问题
Aug 30 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
Oct 26 Javascript
Angular ng-repeat指令实例以及扩展部分
Dec 26 Javascript
JS闭包用法实例分析
Mar 27 Javascript
javascript的日期对象、数组对象、二维数组使用说明
Dec 22 #Javascript
javascript中的遍历for in 以及with的用法
Dec 22 #Javascript
Jquery实现图片预加载与延时加载的方法
Dec 22 #Javascript
javascript定义变量时加var与不加var的区别
Dec 22 #Javascript
javascript操作字符串的原生方法
Dec 22 #Javascript
JavaScript动态创建link标签到head里的方法
Dec 22 #Javascript
javascript中Date对象的getDay方法使用指南
Dec 22 #Javascript
You might like
使用PHP维护文件系统
2006/10/09 PHP
php+ajax无刷新分页实例详解
2015/12/07 PHP
Javascript学习笔记2 函数
2010/01/11 Javascript
jquery 常用操作方法
2010/01/28 Javascript
基于jquery的一个简单的脚本验证插件
2010/04/05 Javascript
js网页侧边随页面滚动广告效果实现
2011/04/14 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
jQuery简易图片放大特效示例代码
2014/06/09 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
js实现分割上传大文件
2016/03/09 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
手写Vue源码之数据劫持示例详解
2021/01/04 Vue.js
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
2016/02/18 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
python实现随机漫步方法和原理
2019/06/10 Python
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
2020/01/13 Python
在keras里面实现计算f1-score的代码
2020/06/15 Python
python二维图制作的实例代码
2020/12/03 Python
使用gunicorn部署django项目的问题
2020/12/30 Python
html5配合css3实现带提示文字的输入框(摆脱js)
2013/03/08 HTML / CSS
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
豪华床上用品 :Jennifer Adams
2019/09/15 全球购物
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
应届实习生的自我评价范文
2014/01/05 职场文书
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
部队党性分析材料
2014/02/16 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
校庆团日活动总结
2014/08/28 职场文书
2014学校领导四风对照检查材料思想汇报
2014/09/23 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书