仅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 相关文章推荐
用脚本调用样式的几种方法
Dec 09 Javascript
很全的显示阴历(农历)日期的js代码
Jan 01 Javascript
如何让页面加载完成后执行js
Jun 26 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
Sep 27 Javascript
使用jquery 简单实现下拉菜单
Jan 14 Javascript
浅谈Javascript的静态属性和原型属性
May 07 Javascript
js改变css样式的三种方法推荐
Jun 28 Javascript
canvas实现动态小球重叠效果
Feb 06 Javascript
原生js实现验证码功能
Mar 16 Javascript
bootstrap timepicker在angular中取值并转化为时间戳
Jun 13 Javascript
vue实现路由不变的情况下,刷新页面操作示例
Feb 02 Javascript
何时/使用 Vue3 render 函数的教程详解
Jul 25 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
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
php格式化时间戳显示友好的时间实现思路及代码
2014/10/23 PHP
PHP使用反射机制实现查找类和方法的所在位置
2016/04/22 PHP
php pdo操作数据库示例
2017/03/10 PHP
PHP基于openssl实现非对称加密代码实例
2020/06/19 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
使用js修改客户端注册表的方法
2013/08/09 Javascript
js图片闪动特效可以控制间隔时间如几分钟闪动一下
2014/08/12 Javascript
javascript日期处理函数,性能优化批处理
2015/09/06 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
2015/12/26 Javascript
JavaScript简单实现弹出拖拽窗口(一)
2016/06/17 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
2016/11/18 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
在微信小程序中渲染HTML内容的方法示例
2018/09/28 Javascript
nodejs和react实现即时通讯简易聊天室功能
2019/08/21 NodeJs
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
[02:19]2018年度DOTA2最佳核心位选手-完美盛典
2018/12/17 DOTA
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
python实践项目之监控当前联网状态详情
2019/05/23 Python
python写日志文件操作类与应用示例
2019/07/01 Python
python递归下载文件夹下所有文件
2019/08/31 Python
python中从for循环延申到推导式的具体使用
2019/11/29 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2020/10/12 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
旷课检讨书3000字
2014/02/04 职场文书
国际贸易专业个人职业生涯规划
2014/02/15 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
高校自主招生校长推荐信
2015/03/23 职场文书
5分钟教你docker安装启动redis全教程(全新方式)
2021/05/29 Redis
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫