仅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 相关文章推荐
基于jsTree的无限级树JSON数据的转换代码
Jul 27 Javascript
jQuery写的日历(包括日历的样式及功能)
Apr 23 Javascript
使用jQuery避免鼠标双击的解决方案
Aug 21 Javascript
javascript中直接引用Microsoft的COM生成Word
Jan 20 Javascript
jQuery树形下拉菜单特效代码分享
Aug 15 Javascript
基于jQuery实现的QQ表情插件
Aug 25 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
Oct 20 Javascript
理解javascript中的with关键字
Feb 15 Javascript
JS FormData上传文件的设置方法
Jul 05 Javascript
ionic App问题总结系列之ionic点击系统返回键退出App
Aug 19 Javascript
layui自定义插件citySelect实现省市区三级联动选择
Jul 26 Javascript
JS+JQuery实现无缝连接轮播图
Dec 30 jQuery
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
ThinkPHP实现二级循环读取的方法
2014/11/03 PHP
Thinkphp框架开发移动端接口(2)
2016/08/18 PHP
javascript中的prototype属性使用说明(函数功能扩展)
2010/08/16 Javascript
js 窗口抖动示例
2013/09/04 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
2015/07/27 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
2016/08/02 Javascript
Js动态设置rem来实现移动端字体的自适应代码
2016/10/14 Javascript
JavaScript中的编码和解码函数
2017/02/15 Javascript
微信小程序 UI与容器组件总结
2017/02/21 Javascript
AngularJS Toaster使用详解
2017/02/24 Javascript
解决Vue编译时写在style中的路径问题
2017/09/21 Javascript
记React connect的几种写法(小结)
2018/09/18 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
vue修改Element的el-table样式的4种方法
2020/09/17 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
Javascript 模拟mvc实现点餐程序案例详解
2020/12/24 Javascript
[17:13]DOTA2 HEROS教学视频教你分分钟做大人-斯拉克
2014/06/13 DOTA
python数据结构学习之实现线性表的顺序
2018/09/28 Python
Pytorch中accuracy和loss的计算知识点总结
2019/09/10 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码
2020/04/10 HTML / CSS
德国网上药房:Apotal
2017/04/04 全球购物
受外贸欢迎的美国主机:BlueHost
2017/05/16 全球购物
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
物业管理毕业生个人的求职信
2013/11/30 职场文书
大学生优秀团员事迹材料
2014/01/30 职场文书
安全承诺书格式范本
2015/04/28 职场文书
python Polars库的使用简介
2021/04/21 Python
redis实现共同好友的思路详解
2021/05/26 Redis
Java存储没有重复元素的数组
2022/04/29 Java/Android
基于Python实现西西成语接龙小助手
2022/08/05 Golang