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 相关文章推荐
js中关于new Object时传参的一些细节分析
Mar 13 Javascript
利用JS延迟加载百度分享代码,提高网页速度
Jul 01 Javascript
实现动画效果核心方式的js代码
Sep 27 Javascript
js实现右下角提示框的方法
Feb 03 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
May 28 Javascript
Vuex之理解Getters的用法实例
Apr 19 Javascript
ES6新特性一: let和const命令详解
Apr 20 Javascript
Angular中的interceptors拦截器
Jun 25 Javascript
vue webpack重写cookie路径的方法
Jul 10 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
Sep 17 Javascript
JS面向对象编程基础篇(三) 继承操作实例详解
Mar 03 Javascript
微信小程序自定义tabBar的踩坑实践记录
Nov 06 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中数字0和空值的区别分析
2014/06/05 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
2015/03/12 PHP
laravel 验证错误信息到 blade模板的方法
2019/09/29 PHP
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
利用bootstrapValidator验证UEditor
2016/09/14 Javascript
jQuery右下角悬浮广告实例
2016/10/17 Javascript
微信小程序 详解Page中data数据操作和函数调用
2017/01/12 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
深入浅析Vue不同场景下组件间的数据交流
2017/08/15 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
Vue实例中生命周期created和mounted的区别详解
2017/08/25 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
2020/03/03 Javascript
[02:04]2018DOTA2亚洲邀请赛Secret赛前采访
2018/04/03 DOTA
[01:35:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第一场 1月18日
2021/03/11 DOTA
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
python利用dir函数查看类中所有成员函数示例代码
2017/09/08 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
Python银行系统实战源码
2019/10/25 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
Python实现线性判别分析(LDA)的MATLAB方式
2019/12/09 Python
python如何随机生成高强度密码
2020/08/19 Python
python 高阶函数简单介绍
2021/02/19 Python
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
实习生评语
2014/04/26 职场文书
五好关工委申报材料
2014/05/31 职场文书
材料专业大学毕业生自荐书
2014/07/02 职场文书
优秀团员事迹材料1500字
2014/08/31 职场文书
师德师风剖析材料
2014/09/30 职场文书
2014年青年志愿者工作总结
2014/12/09 职场文书
2014年司法局工作总结
2014/12/11 职场文书
学生检讨书怎么写
2015/05/07 职场文书
经济纠纷起诉状
2015/05/20 职场文书
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers