仅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限制文本框输入值类型的方法
May 07 Javascript
javascript实现点击提交按钮后显示loading的方法
Jul 03 Javascript
JavaScript常用本地对象小结
Mar 28 Javascript
jQuery Mobile 和 Kendo UI 的比较
May 05 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
Aug 28 Javascript
探讨AngularJs中ui.route的简单应用
Nov 16 Javascript
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
Oct 19 jQuery
利用node.js如何创建子进程详解
Dec 09 Javascript
详解Angular路由之路由守卫
May 10 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
Jul 05 jQuery
dts文件中删除一个node或属性的操作方法
Aug 05 Javascript
js实现简单掷骰子小游戏
Oct 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中global和$GLOBALS[]的分析之一
2012/02/02 PHP
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
2012/04/09 PHP
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
PHP中file_exists函数不支持中文名的解决方法
2014/07/26 PHP
php针对cookie操作的队列操作类实例
2014/12/10 PHP
浅谈json_encode用法
2015/03/05 PHP
php注册登录系统简化版
2020/12/28 PHP
新浪中用来显示flash的函数
2007/04/02 Javascript
网页整体变灰白色(兼容各浏览器)实例
2013/04/21 Javascript
简单实用的全选反选按钮例子
2013/10/18 Javascript
jQuery之选项卡的简单实现
2014/02/28 Javascript
JavaScript中的对象的extensible属性介绍
2014/12/30 Javascript
JavaScript中for循环的几种写法与效率总结
2017/02/03 Javascript
react native 获取地理位置的方法示例
2018/08/28 Javascript
JS实现百度网盘任意文件强制下载功能
2018/08/31 Javascript
js实现select下拉框选择
2020/01/11 Javascript
JavaScript实现沿五角星形线摆动的小圆实例详解
2020/07/28 Javascript
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
python友情链接检查方法
2015/07/08 Python
使用Python写个小监控
2016/01/27 Python
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
2019/02/12 Python
python+os根据文件名自动生成文本
2019/03/21 Python
使用OpenCV实现道路车辆计数的使用方法
2020/07/15 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
浅谈HTML5 Web Worker的使用
2018/01/05 HTML / CSS
详解如何在登录过期后跳出Ifram框架
2020/09/10 HTML / CSS
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
编写用C语言实现的求n阶阶乘问题的递归算法
2014/10/21 面试题
餐饮主管岗位职责
2013/12/10 职场文书
银行服务感言
2014/03/01 职场文书
体育教师求职信
2014/06/30 职场文书
文艺晚会开场白
2015/05/29 职场文书
关于PHP数组迭代器的使用方法实例
2021/11/17 PHP
python前后端自定义分页器
2022/04/13 Python