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 相关文章推荐
javascript感应鼠标图片透明度显示的方法
Feb 24 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
Aug 21 Javascript
javascript伸缩菜单栏实现代码分享
Nov 12 Javascript
基于javascript html5实现多文件上传
Mar 03 Javascript
angular+ionic返回上一页并刷新页面
Aug 08 Javascript
jQuery实现checkbox全选功能完整实例
Jul 12 jQuery
swiper.js插件实现pc端文本上下滑动功能示例
Dec 03 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
Sep 10 jQuery
理解Proxy及使用Proxy实现vue数据双向绑定操作
Jul 18 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
Aug 30 Javascript
编写v-for循环的技巧汇总
Dec 01 Javascript
浅析JavaScript中的变量提升
Jun 01 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个人网站架设连环讲(一)
2006/10/09 PHP
PHP explode()函数用法、切分字符串
2012/10/03 PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
2015/05/13 PHP
zend framework重定向方法小结
2016/05/28 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
拖动Html元素集合 Drag and Drop any item
2006/12/22 Javascript
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
jQuery实现模拟marquee标签效果
2015/07/14 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
CSS或者JS实现鼠标悬停显示另一元素
2016/01/22 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
JS正则替换去空格的方法
2017/03/24 Javascript
vue组件Prop传递数据的实现示例
2017/08/17 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
python 并发编程 多路复用IO模型详解
2019/08/20 Python
Python Web静态服务器非堵塞模式实现方法示例
2019/11/21 Python
tensorflow模型保存、加载之变量重命名实例
2020/01/21 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
2021/01/09 Python
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
美国受信赖的教育产品供应商:Nest Learning
2018/06/14 全球购物
路德维希•贝克(LUDWIG BECK)中文官网:德国大型美妆百货
2020/09/19 全球购物
最新大学职业规划书范文
2013/12/30 职场文书
财务会计人员求职的自我评价
2014/01/13 职场文书
接待员岗位责任制
2014/02/10 职场文书
不打扫卫生检讨书
2014/02/12 职场文书
领导干部“四风”问题批评与自我批评材料
2014/09/24 职场文书
佛光寺导游词
2015/02/10 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server
MySQL中的引号和反引号的区别与用法详解
2021/10/24 MySQL
在CSS中使用when/else的方法
2022/01/18 HTML / CSS