仅IE9/10同时支持script元素的onload和onreadystatechange事件分析


Posted in Javascript onApril 27, 2011

如下

<!DOCTYPE HTML> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>IE9/10同时支持script元素的onload和onreadystatechange事件</title> 
<script src="http://code.jquery.com/jquery.min.js" onload="alert(1)" onreadystatechange="alert(2)"></script> 
</head> 
<body> 
</body> 
</html>

结果:
IE6/7/8 : 弹出2
IE9/10 : 弹出2,1
Firefox/Safari/Chrome/Opera : 弹出1
测试结果可以看出,IE9后已经开始支持script的onload事件了。一直以来我们判断js文件是否已经加载完成就是用以上的两个事件。很久以前就知道IE中使用onreadystatechange事件,事件handler中使用readyState的值判断是否加载完成。其它浏览器使用onload事件。
if(isIE){ 
script.onreadystatechange = function(){ 
if(this.readyState == 'loaded' || this.readyState == 'complete'){ 
callback(); 
} 
} 
}else{ 
script.onload = function(){ 
callback(); 
} 
}

这种写法现在也没有问题。但如下写法可能会让的回调在IE9/10中执行两次
script.onload = script.onreadystatechange = function(){ 
if(!this.readyState || this.readyState == "loaded" || this.readyState == "complete"){ 
callback(); 
} 
}

这种写法的取巧之处在于onload和onreadystatechage都用同一个函数,Firefox/Safari/Chrome/Opera中不支持onreadystatechage事件,也没有readyState属性,所以 !this.readyState 是针对这些浏览器。readyState是针对IE浏览器,载入完毕的情况是loaded,缓存的情况下可能会出现readyState为complete。所以两个不能少。但由于IE9/10也已经支持onload事件了,会造成callback执行2次。

相关:

http://www.w3.org/TR/html401/interact/scripts.html#h-18.2.1 

http://www.w3.org/TR/html5/scripting-1.html#script

https://developer.mozilla.org/En/HTML/Element/Script 

Javascript 相关文章推荐
jQuery find和children方法使用
Jan 31 Javascript
jQuery.getScript加载同域JS的代码
Feb 13 Javascript
JavaScript基础语法让人疑惑的地方小结
May 23 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
Nov 28 Javascript
使用apply方法实现javascript中的对象继承
Dec 16 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
Mar 01 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
Sep 17 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
Mar 09 Javascript
使用nvm管理不同版本的node与npm的方法
Oct 31 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
Jul 26 Javascript
详解Vue2.0组件的继承与扩展
Nov 23 Javascript
Vue和Flask通信的实现
May 19 Vue.js
js实时监听文本框状态的方法
Apr 26 #Javascript
Javascript中的window.event.keyCode使用介绍
Apr 26 #Javascript
Javascript中正则表达式的全局匹配模式分析
Apr 26 #Javascript
说明你的Javascript技术很烂的五个原因
Apr 26 #Javascript
jQuery学习总结之元素的相对定位和选择器(持续更新)
Apr 26 #Javascript
用jquery实现自定义风格的滑动条实现代码
Apr 26 #Javascript
超轻量级的基于jquery的三级展开列表
Apr 26 #Javascript
You might like
菜鸟修复电子管记
2021/03/02 无线电
php+dbfile开发小型留言本
2006/10/09 PHP
php中如何同时使用session和cookie来保存用户登录信息
2013/07/05 PHP
php中count获取多维数组长度的方法
2014/11/03 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
解析JSON对象与字符串之间的相互转换
2013/12/18 Javascript
javascript图片预加载实例分析
2015/07/16 Javascript
AngularJS基础 ng-csp 指令详解
2016/08/01 Javascript
jQuery操作cookie
2016/08/08 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
用vuex写了一个购物车H5页面的示例代码
2018/12/04 Javascript
如何手动实现es5中的bind方法详解
2018/12/07 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
2019/08/16 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
vue实现跳转接口push 转场动画示例
2019/11/01 Javascript
vue点击自增和求和的实例代码
2019/11/06 Javascript
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
[01:54]TI珍贵瞬间系列(三):翻盘
2020/08/28 DOTA
python异步任务队列示例
2014/04/01 Python
Python入门篇之正则表达式
2014/10/20 Python
python写日志封装类实例
2015/06/28 Python
numpy自动生成数组详解
2017/12/15 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
Django框架实现的分页demo示例
2019/05/25 Python
tensorflow 变长序列存储实例
2020/01/20 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
浅析Python __name__ 是什么
2020/07/07 Python
高性能装备提升营地:Kammok
2019/02/27 全球购物
信息部岗位职责
2013/11/12 职场文书
遗体告别仪式答谢词
2014/01/23 职场文书
抗洪救灾标语
2014/10/08 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书
《家世》读后感:看家训的力量
2019/12/30 职场文书
MySQL修炼之联结与集合浅析
2021/10/05 MySQL