仅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 相关文章推荐
javascript最常用与实用的创建类的代码
Aug 12 Javascript
javascript 函数声明与函数表达式的区别介绍
Oct 05 Javascript
JS控制弹出新页面窗口位置和大小的方法
Mar 02 Javascript
早该知道的7个JavaScript技巧
Jun 21 Javascript
jquery判断类型是不是number类型的实例代码
Oct 07 Javascript
jQuery实现大图轮播
Feb 13 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
Jun 19 Javascript
vuejs事件中心管理组件间的通信详解
Aug 09 Javascript
js中document.write和document.writeln的区别
Mar 11 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
Jan 31 Javascript
微信打开网址添加在浏览器中打开提示的办法
May 20 Javascript
安装多版本Vue-CLI的实现方法
Mar 24 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
随时给自己贴的图片加文字的php水印
2007/03/16 PHP
浅谈php扩展imagick
2014/06/02 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
2016/11/12 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
PHP实现的分解质因数操作示例
2018/08/01 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
js三种排序算法分享
2012/08/16 Javascript
js 在定义的时候立即执行的函数表达式(function)写法
2013/01/16 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
2014/06/26 Javascript
node.js中的fs.futimes方法使用说明
2014/12/17 Javascript
NodeJS学习笔记之Connect中间件应用实例
2015/01/27 NodeJs
精通JavaScript的this关键字
2020/05/28 Javascript
概述BootStrap中role=&quot;form&quot;及role作用角色
2016/12/08 Javascript
JavaScript初学者必看“new”
2017/06/12 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
js 获取json数组里面数组的长度实例
2017/10/31 Javascript
vue 挂载路由到头部导航的方法
2017/11/13 Javascript
JS自定义对象创建与简单使用方法示例
2020/01/15 Javascript
原生js实现购物车功能
2020/09/23 Javascript
python根据路径导入模块的方法
2014/09/30 Python
python实现简单的计时器功能函数
2015/03/14 Python
Python解析excel文件存入sqlite数据库的方法
2016/11/15 Python
Python编程判断一个正整数是否为素数的方法
2017/04/14 Python
关于Python中空格字符串处理的技巧总结
2017/08/10 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
2019/07/04 Python
Django实现分页显示效果
2019/10/31 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
浅谈Python xlwings 读取Excel文件的正确姿势
2021/02/26 Python
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
关于观后感的作文
2015/06/18 职场文书
超外差式晶体管收音机的组装与统调
2021/04/22 无线电
详解Python为什么不用设计模式
2021/06/24 Python