仅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 相关文章推荐
cnblogs中在闪存中屏蔽某人的实现代码
Nov 14 Javascript
javascript温习的一些笔记 基础常用知识小结
Jun 22 Javascript
JS模板实现方法
Apr 03 Javascript
js字母大小写转换实现方法总结
Nov 13 Javascript
js对象继承之原型链继承实例
Jan 10 Javascript
原生javascript实现Tab选项卡切换功能
Jan 12 Javascript
原生js实现移动端瀑布流式代码示例
Dec 18 Javascript
JS实现title标题栏文字不间断滚动显示效果
Sep 07 Javascript
jQuery插件HighCharts绘制2D半圆环图效果示例【附demo源码下载】
Mar 09 Javascript
关于JSON解析的实现过程解析
Oct 08 Javascript
Vue使用Element实现增删改查+打包的步骤
Nov 25 Vue.js
微信小程序视频弹幕发送功能的实现
Dec 28 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
Search Engine Friendly的URL设计
2006/10/09 PHP
zend api扩展的php对象的autoload工具
2011/04/18 PHP
供参考的 php 学习提高路线分享
2011/10/23 PHP
CentOS下PHP安装Oracle扩展
2015/02/15 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
2015/07/01 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
JavaScript 入门基础知识 想学习js的朋友可以参考下
2009/12/26 Javascript
jquery ajax 同步异步的执行示例代码
2010/06/23 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
Vue.js实现微信过渡动画左右切换效果
2017/06/13 Javascript
NodeJS 实现手机短信验证模块阿里大于功能
2017/06/19 NodeJs
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
Vue2.0+ElementUI实现表格翻页的实例
2017/10/23 Javascript
关于vue v-for循环解决img标签的src动态绑定问题
2018/09/18 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
浅谈webpack 四个核心概念之Entry
2019/06/12 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
2020/01/21 Javascript
Python中matplotlib中文乱码解决办法
2017/05/12 Python
Python3单行定义多个变量或赋值方法
2018/07/12 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
Django之PopUp的具体实现方法
2019/08/31 Python
django中media媒体路径设置的步骤
2019/11/15 Python
如何在 Django 模板中输出 &quot;{{&quot;
2020/01/24 Python
python3实现名片管理系统(控制台版)
2020/11/29 Python
澳大利亚时尚前卫设计师珠宝在线:Amber Sceats
2017/10/04 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
经典大学生求职信范文
2014/01/06 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
促销活动总结怎么写
2014/06/25 职场文书
学雷锋团日活动总结
2015/05/06 职场文书
关于迟到的检讨书
2015/05/06 职场文书
股东协议书范本2016
2016/03/21 职场文书