仅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 和 CSS 实现脚注(Footnote)效果
Sep 09 Javascript
js下获取div中的数据的原理分析
Apr 07 Javascript
Javascript Object 对象学习笔记
Dec 17 Javascript
JavaScript中两个字符串的匹配
Jun 08 Javascript
js 实现数值的千分位及保存小数方法(推荐)
Aug 01 Javascript
js 将图片连接转换成base64格式的简单实例
Aug 10 Javascript
Jquery删除css属性的简单方法
Dec 04 Javascript
inner join 内联与left join 左联的实例代码
Sep 18 Javascript
Vue使用zTree插件封装树组件操作示例
Apr 25 Javascript
jquery实现垂直无限轮播的方法分析
Jul 16 jQuery
微信小程序获取用户信息及手机号(后端TP5.0)
Sep 12 Javascript
vue实现标签云效果的示例
Nov 09 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
thinkphp实现分页显示功能
2016/12/03 PHP
jQuery Ajax 实例全解析
2011/04/20 Javascript
分析Node.js connect ECONNREFUSED错误
2013/04/09 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
用nodejs实现PHP的print_r函数代码
2014/03/14 NodeJs
js实现仿百度瀑布流的方法
2015/02/05 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
2016/06/17 Javascript
详解ECharts使用心得总结
2016/12/06 Javascript
Vue表单验证插件Vue Validator使用方法详解
2017/04/07 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
Angular2监听页面大小变化的解决方法
2017/10/09 Javascript
vue-router路由懒加载和权限控制详解
2017/12/13 Javascript
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
2018/01/08 jQuery
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
详解vue中axios的封装
2018/07/18 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
ajax与jsonp的区别及用法
2018/10/16 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
python导出hive数据表的schema实例代码
2018/01/22 Python
浅谈pandas中shift和diff函数关系
2018/04/08 Python
python3 pandas 读取MySQL数据和插入的实例
2018/04/20 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
Python中的sys.stdout.write实现打印刷新功能
2020/02/21 Python
基于打开pycharm有带图片md文件卡死问题的解决
2020/04/24 Python
Python 使用Opencv实现目标检测与识别的示例代码
2020/09/08 Python
python实现逻辑回归的示例
2020/10/09 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
中国最大的名表商城:万表网
2016/08/29 全球购物
软件测试有哪些?什么是配置项?
2012/02/12 面试题
承租经营合作者协议书
2014/10/01 职场文书
2015年试用期工作总结
2014/12/12 职场文书
一波干货,会议主持词开场白范文
2019/05/06 职场文书
Go语言应该什么情况使用指针
2021/07/25 Golang