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代码
Aug 18 Javascript
jquery.form.js用法之清空form的方法
Mar 07 Javascript
jQuery的animate函数实现图文切换动画效果
May 03 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
Jan 05 Javascript
Javascript随机标签云代码实例
Jun 21 Javascript
js倒计时显示实例
Dec 11 Javascript
JS实现简单短信验证码界面
Aug 07 Javascript
简单的Vue异步组件实例Demo
Dec 27 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
Jan 03 Javascript
使用Nuxt.js改造已有项目的方法
Aug 07 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
Oct 14 Javascript
如何利用javascript接收json信息并进行处理
Aug 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获取指定函数定义在哪个文件中以及其所在的行号实例
2014/05/08 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
yii2.0实现pathinfo的形式访问的配置方法
2016/04/06 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
2015/08/26 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
几种经典排序算法的JS实现方法
2016/03/25 Javascript
JavaScript的ExtJS框架中表格的编写教程
2016/05/21 Javascript
jQuery实现链接的title快速出现的方法
2017/02/20 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
2018/09/14 Javascript
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
js实现内置计时器
2019/12/16 Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
2020/06/03 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
2020/10/30 Javascript
python中合并两个文本文件并按照姓名首字母排序的例子
2014/04/25 Python
bat和python批量重命名文件的实现代码
2016/05/19 Python
python自动发送邮件脚本
2018/06/20 Python
Django使用unittest模块进行单元测试过程解析
2019/08/02 Python
python Shapely使用指南详解
2020/02/18 Python
Python decorator拦截器代码实例解析
2020/04/04 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
个人求职简历的自我评价
2013/10/19 职场文书
自动化专业个人求职信范文
2013/12/30 职场文书
导游词怎么写
2015/02/04 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
超市店长竞聘书
2015/09/15 职场文书
使用 CSS 轻松实现一些高频出现的奇形怪状按钮
2021/12/06 HTML / CSS