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实现input输入框实时输入触发事件代码
Jan 28 Javascript
jquery取消选择select下拉框示例代码
Feb 22 Javascript
jquery实现点击文字可编辑并修改保存至数据库
Apr 15 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
Jun 30 Javascript
分析了一下JQuery中的extend方法实现原理
Feb 27 Javascript
JavaScript实现自动变换表格边框颜色
May 08 Javascript
JS实现转动随机数抽奖特效代码
Apr 16 Javascript
简单谈谈ES6的六个小特性
Nov 18 Javascript
vue-resource拦截器设置头信息的实例
Oct 27 Javascript
Vue页面骨架屏的实现方法
May 22 Javascript
解决vue中虚拟dom,无法实时更新的问题
Sep 15 Javascript
浅谈JavaScript中this的指向问题
Jul 28 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
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
PHP daddslashes 使用方法介绍
2012/10/26 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
PHP实现简单计算器小程序
2020/08/28 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
弹出窗口并且此窗口带有半透明的遮罩层效果
2014/03/13 Javascript
JavaScript+html5 canvas实现本地截图教程
2020/04/16 Javascript
jquery html动态添加的元素绑定事件详解
2016/05/24 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
fullPage.js和CSS3实现全屏滚动效果
2017/05/05 Javascript
微信小程序删除处理详解
2017/08/16 Javascript
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
2017/12/28 Javascript
浅谈如何使用webpack构建多页面应用
2018/05/30 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
微信小程序http连接访问解决方案的示例
2018/11/05 Javascript
javascript 对象 与 prototype 原型用法实例分析
2019/11/11 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
2020/04/23 Javascript
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
Python 深入理解yield
2008/09/06 Python
Python内置函数OCT详解
2016/11/09 Python
Python科学画图代码分享
2017/11/29 Python
使用python为mysql实现restful接口
2018/01/05 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
三分钟演讲稿事例
2014/03/03 职场文书
煤矿班组长竞聘书
2014/03/31 职场文书
求职意向书
2014/04/01 职场文书
关于环保的标语
2014/06/13 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
标准单位租车协议书
2014/09/23 职场文书
安全教育片观后感
2015/06/17 职场文书
同意报考公务员证明
2015/06/17 职场文书
初三语文教学反思
2016/03/03 职场文书
创业计划书之烤红薯
2019/09/26 职场文书
html解决浏览器记住密码输入框的问题
2023/05/07 HTML / CSS