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 相关文章推荐
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
Apr 21 Javascript
JS分页效果示例
Oct 11 Javascript
自己使用jquery写的一个无缝滚动的插件
Apr 30 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
Aug 10 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
Sep 23 Javascript
为什么JS中eval处理JSON数据要加括号
Apr 13 Javascript
JavaScript驾驭网页-获取网页元素
Mar 24 Javascript
js获取客户端操作系统类型的方法【测试可用】
May 27 Javascript
AngularJS删除路由中的#符号的方法
Sep 20 Javascript
jQuery基于cookie实现换肤功能实例
Oct 14 jQuery
Dropify.js图片宽高自适应的方法
Nov 27 Javascript
微信小程序版翻牌小游戏
Jan 26 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中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
2012/09/07 PHP
php中用memcached实现页面防刷新功能
2014/08/19 PHP
从零开始学YII2框架(六)高级应用程序模板
2014/08/20 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
php连接微软MSSQL(sql server)完全攻略
2016/11/27 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
javascript抖动元素的小例子
2013/10/28 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
jQuery javascript获得网页的高度与宽度的实现代码
2016/04/26 Javascript
AngularJS ng-bind-html 指令详解及实例代码
2016/07/30 Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
2017/03/15 Javascript
js随机生成一个验证码
2017/06/01 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
VUE 配置vue-devtools调试工具及安装方法
2018/09/30 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
小程序使用分包的示例代码
2020/03/23 Javascript
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
使用Python的urllib和urllib2模块制作爬虫的实例教程
2016/01/20 Python
python交互式图形编程实例(二)
2017/11/17 Python
zookeeper python接口实例详解
2018/01/18 Python
Python扩展内置类型详解
2018/03/26 Python
python 基本数据类型占用内存空间大小的实例
2018/06/12 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
Python Flask框架实现简单加法工具过程解析
2020/06/03 Python
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
结婚喜宴主持词
2014/03/14 职场文书
护士辞职信怎么写
2015/02/27 职场文书
新闻通讯稿模板
2015/07/22 职场文书
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL
mysql查看表结构的三种方法总结
2022/07/07 MySQL