仅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 相关文章推荐
网页自动刷新,不产生嗒嗒声的一个解决方法
Mar 27 Javascript
js活用事件触发对象动作
Aug 10 Javascript
js的表单操作 简单计算器
Dec 29 Javascript
JS获取DropDownList的value值与text值的示例代码
Jan 07 Javascript
js使用for循环查询数组中是否存在某个值
Aug 12 Javascript
使用JQuery库提供的扩展功能实现自定义方法
Sep 09 Javascript
浅谈javascript中的闭包
May 13 Javascript
JavaScript截断字符串的方法
Jul 15 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
Dec 22 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
Mar 01 Javascript
微信小程序开发之自定义tabBar的实现
Sep 06 Javascript
JavaScript 装逼指南(js另类写法)
May 10 Javascript
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
ubuntu10.04配置 nginx+php-fpm模式的详解
2013/06/03 PHP
php二维数组用键名分组相加实例函数
2013/11/06 PHP
php通过asort()给关联数组按照值排序的方法
2015/03/18 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
php给数组赋值的实例方法
2019/09/26 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
js实现格式化金额,字符,时间的方法
2015/02/26 Javascript
JS实现网页上随机产生超链接地址的方法
2015/11/09 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
JS二分查找算法详解
2017/11/01 Javascript
实例讲解JS中pop使用方法
2019/01/27 Javascript
Vue侦测相关api的实现方法
2019/05/22 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
Vue中函数防抖节流的理解及应用实现
2020/04/24 Javascript
小程序实现上下切换位置
2020/11/16 Javascript
讲解Python中的递归函数
2015/04/27 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
Python切片索引用法示例
2018/05/15 Python
深入理解Django-Signals信号量
2019/02/19 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
Python的历史与优缺点整理
2020/05/26 Python
python thrift 实现 单端口多服务的过程
2020/06/08 Python
python编程的核心知识点总结
2021/02/08 Python
美国羊皮公司:Overland
2018/01/15 全球购物
巴西最大的玩具连锁店:Ri Happy
2020/06/17 全球购物
土木工程应届生求职信
2013/10/31 职场文书
银行奉献演讲稿
2014/09/16 职场文书
个人售房合同协议书
2016/03/21 职场文书
PHP中->和=>的意思
2021/03/31 PHP
使用CSS3实现按钮悬停闪烁动态特效代码
2021/08/30 HTML / CSS
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS