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 页面内容搜索,类似于 Ctrl+F功能的实现代码
Aug 13 Javascript
2007/12/23更新创意无限,简单实用(javascript log)
Dec 24 Javascript
javascript DOM编程实例(智播客学习)
Nov 23 Javascript
合并table相同单元格的jquery插件分享(很精简)
Jun 20 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
Feb 28 Javascript
js调试系列 断点与动态调试[基础篇]
Jun 18 Javascript
实例解析jQuery中proxy()函数的用法
May 24 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
Aug 24 Javascript
Jquery的Ajax技术使用方法
Jan 21 jQuery
angularjs自定义过滤器demo示例
Aug 24 Javascript
JavaScript基础之this和箭头函数详析
Sep 05 Javascript
Vue axios 跨域请求无法带上cookie的解决
Sep 08 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实现的MongoDB数据库操作类分享
2014/05/12 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
PHP与Java对比学习日期时间函数
2016/07/03 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
微信小程序 less文件编译成wxss文件实现办法
2016/12/05 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
2017/08/20 Javascript
vue-ajax小封装实例
2017/09/18 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
Python匹配中文的正则表达式
2016/05/11 Python
python 判断是否为正小数和正整数的实例
2017/07/23 Python
深入学习Python中的上下文管理器与else块
2017/08/27 Python
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
基于python3 OpenCV3实现静态图片人脸识别
2018/05/25 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
2019/07/08 Python
django 信号调度机制详解
2019/07/19 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
Pycharm安装并配置jupyter notebook的实现
2020/05/18 Python
python 将列表里的字典元素合并为一个字典实例
2020/09/01 Python
Python os库常用操作代码汇总
2020/11/03 Python
Python解析微信dat文件的方法
2020/11/30 Python
Python对excel的基本操作方法
2021/02/18 Python
Hotels.com韩国:海外国内旅行所需的酒店和住宿预订网站
2020/05/08 全球购物
怎样写好自荐信和推荐信
2013/12/26 职场文书
优秀演讲稿范文
2013/12/29 职场文书
五年级音乐教学反思
2014/02/06 职场文书
产品设计开发计划书
2014/05/07 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
2019通用版新员工入职培训方案!
2019/07/11 职场文书
React配置子路由的实现
2021/06/03 Javascript
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL