仅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 相关文章推荐
JQuery 学习笔记 element属性控制
Jul 23 Javascript
添加JavaScript重载函数的辅助方法2
Jul 04 Javascript
input按钮的事件处理大全
Dec 10 Javascript
如何制作浮动广告 JavaScript制作浮动广告代码
Dec 30 Javascript
一个简单的JS鼠标悬停特效具体方法
Jun 17 Javascript
禁止空格提交表单的js代码
Nov 17 Javascript
jquery获得同源iframe内body下标签的值的方法
Sep 25 Javascript
jQuery 回调函数(callback)的使用和基础
Feb 26 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
Sep 01 Javascript
javascript实现保留两位小数的多种方法
Dec 18 Javascript
JavaScript基础知识之方法汇总结
Jan 24 Javascript
通过jQuery学习js类型判断的技巧
May 27 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
php 各种应用乱码问题的解决方法
2010/05/09 PHP
PHP测试程序运行时间的类
2012/02/05 PHP
PHP实现将标点符号正则替换为空格的方法
2017/08/09 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
读jQuery之一(对象的组成)
2011/06/11 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
2012/02/03 Javascript
深入理解Javascript里的依赖注入
2014/03/19 Javascript
webpack实现热更新(实施同步刷新)
2017/07/28 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
[42:00]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第一场 12.13
2020/12/17 DOTA
PyCharm配置mongo插件的方法
2018/11/30 Python
python实现简单加密解密机制
2019/03/19 Python
Python基础教程之if判断,while循环,循环嵌套
2019/04/25 Python
dpn网络的pytorch实现方式
2020/01/14 Python
Python动态导入模块和反射机制详解
2020/02/18 Python
Python常见反爬虫机制解决方案
2020/06/01 Python
解决python中0x80072ee2错误的方法
2020/07/19 Python
HTML5的结构和语义(2):结构
2008/10/17 HTML / CSS
找到您丢失的钥匙、钱包和手机:Tile
2017/05/19 全球购物
售后服务承诺书范文
2014/03/26 职场文书
学生自我鉴定格式及范文
2014/09/16 职场文书
资产运营委托书范本
2014/10/16 职场文书
运动会广播稿200字
2014/10/18 职场文书
支行行长竞聘报告
2014/11/06 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
2015年党性分析材料
2014/12/19 职场文书
同意落户证明
2015/06/19 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python
教你使用Ubuntu搭建DNS服务器
2022/09/23 Servers