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 相关文章推荐
jquery中eq和get的区别与使用方法
Apr 14 Javascript
Jquery获取复选框被选中值的简单方法
Jul 04 Javascript
js AppendChild与insertBefore用法详细对比
Dec 16 Javascript
使用Chrome浏览器调试AngularJS应用的方法
Jun 18 Javascript
javascript每日必学之多态
Feb 23 Javascript
星期几的不同脚本写法(推荐)
Jun 01 Javascript
jQuery 调用WebService 实例讲解
Jun 28 Javascript
原生JS与jQuery编写简单选项卡
Oct 30 jQuery
Node中使用ES6语法的基础教程
Jan 05 Javascript
vue.js中实现登录控制的方法示例
Apr 23 Javascript
Vue编程式跳转的实例代码详解
Jul 10 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
Feb 12 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学习之 数组声明
2011/06/09 PHP
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
thinkPHP实现MemCache分布式缓存功能
2016/03/23 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
PDO::commit讲解
2019/01/27 PHP
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
js使用for循环与innerHTML获取选中tr下td值
2014/09/26 Javascript
AngularJS内置指令
2015/02/04 Javascript
javascript实现给定半径求出圆的面积
2015/06/26 Javascript
深入分析javascript中的错误处理机制
2016/07/17 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
js实现删除json中指定的元素
2020/09/22 Javascript
[01:51]历届DOTA2国际邀请赛举办地回顾 TI9落地上海
2018/08/26 DOTA
python通过scapy获取局域网所有主机mac地址示例
2014/05/04 Python
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
python 2.7.13 安装配置方法图文教程
2018/09/18 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
River Island美国官网:英国高街时尚品牌
2018/09/04 全球购物
介绍一下Java中标识符的命名规则
2014/02/03 面试题
关于护士节的演讲稿
2014/05/26 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
公务员党员评议表自我鉴定
2014/09/14 职场文书
党的群众路线教育实践活动个人整改措施
2014/10/27 职场文书
共青团员自我评价
2015/03/10 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
MySQL查询日期时间
2022/05/15 MySQL