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 HashTable
Jan 22 Javascript
javascript dom 操作详解 js加强
Jul 13 Javascript
Javascript 类型转换方法
Oct 24 Javascript
jQuery探测位置的提示弹窗(toolTip box)详细解析
Nov 14 Javascript
Vue.js动态组件解析
Sep 09 Javascript
利用vue实现模态框组件
Dec 19 Javascript
Bootstrap列表组学习使用
Feb 09 Javascript
socket.io实现在线群聊功能
Apr 07 Javascript
使用vue制作FullPage页面滚动效果
Aug 21 Javascript
vue cli2.0单页面title修改方法
Jun 07 Javascript
对angularJs中controller控制器scope父子集作用域的实例讲解
Oct 08 Javascript
使用js实现一个简单的滚动条过程解析
Sep 10 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 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
php实现的DateDiff和DateAdd时间函数代码分享
2014/08/16 PHP
windows下apache搭建php开发环境
2015/08/27 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
2016/01/11 PHP
PHP 类与构造函数解析
2017/02/06 PHP
浅谈php调用python文件
2019/03/29 PHP
javascript之ESC(第二类混淆)
2007/05/06 Javascript
一段利用WSH修改和查看IP配置的代码
2008/05/11 Javascript
js中数组Array的一些常用方法总结
2013/08/12 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
动态加载js文件简单示例
2016/04/21 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
2017/12/11 Javascript
Vue render函数实战之实现tabs选项卡组件
2019/04/22 Javascript
解决Nuxt使用axios跨域问题
2020/07/06 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
python通过ElementTree操作XML获取结点读取属性美化XML
2013/12/02 Python
python两种遍历字典(dict)的方法比较
2014/05/29 Python
python 处理dataframe中的时间字段方法
2018/04/10 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
Python unittest discover批量执行代码实例
2020/09/08 Python
简单了解python关键字global nonlocal区别
2020/09/21 Python
python3代码输出嵌套式对象实例详解
2020/12/03 Python
Python tkinter之Bind(绑定事件)的使用示例
2021/02/05 Python
CSS3效果:自定义“W”形运行轨迹实例
2017/03/29 HTML / CSS
进修护士自我鉴定
2013/10/14 职场文书
土木工程专业本科生求职信
2014/10/01 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
庆七一活动简报
2015/07/20 职场文书
小学五年级班主任工作经验交流材料
2015/11/02 职场文书