IE6 IE7 IE8 对 onreadystatechange 事件的扩充

news/2024/7/7 9:51:38

问题描述

onreadystatechange 事件通常用在基于 XMLHttpRequest 对象的 AJAX 应用中,当的该对象的 load state 改变时,会触发此事件。

但在 IE 中 onreadystatechange 事件是其私有实现的,用于数据加载的 IMG、SCRIPT 和 LINK 标记,常常被误用 onreadystatechange 事件而导致在非 IE 浏览器中无法得到预期结果。

造成的影响

onreadystatechange 事件处理在各浏览器支持不一致,可能会导非预期结果。

受影响的浏览器

IE6 IE7 IE8 

问题分析

onreadystatechange 事件是微软对 IE 浏览器的私有事件扩充,所有元素都存在 onreadystatechange 事件。
下列元素对象总可以触发此事件,因为他们均会加载数据:APPLET,DOCUMENT,FRAME,FRAMESET,IFRAME,IMG,LINK,OBJECT,SCRIPT 和 XML 元素。
其他元素对象仅当 DHTML Behavior 被追加后会触发 onreadystatechange 事件。

其具体信息可以参照 MSDN 说明:http://msdn.microsoft.com/en-us/library/ms536957(VS.85).aspx。

本文中将主要以 IMG、SCRIPT、LINK 这三个元素对象为例来检测浏览器对他们的 onreadystatechange 事件支持程度。

首先,分析以下代码,将 onreadystatechange 事件作为内联事件分别写于 IMG、SCRIPT 和 LINK 标记中:

<script>
  function OnStateChangeImage(image) {
    document.getElementById ('img-info').innerHTML += '<br />readyState: ' + image.readyState;
  }
  function OnStateChangeScript(script) {
    document.getElementById ('script-info').innerHTML += '<br />readyState: ' + script.readyState;
  }
  function OnStateChangeLink(link) {
    document.getElementById ('link-info').innerHTML += '<br />readyState: ' + link.readyState;
  }
</script>
<span id="link-info" >The link is loading.</span><br />
<span id="img-info" >The image is loading.</span><br />
<span id="script-info">The script is loading.</span><br />
<link rel="stylesheet" type="text/css" href="../../../../../css/article.css" onreadystatechange="OnStateChangeLink(this)" />
<img src="w3c.png"  onreadystatechange="OnStateChangeImage (this)" />
<script src='http://code.jquery.com/jquery-1.4.js' onreadystatechange="OnStateChangeScript(this)"></script>

在各浏览器输出如下:

 IE6 IE7 IE8Firefox Safari Chrome Opera
IMGThe image is loading.
The image readyState: complete
The image is loading.
SCRIPTThe script is loading.
The script readyState: loading
The script readyState: loaded
The script readyState: complete
The scirpt is loading
LINKThe link is loading.
The link readyState: complete
The link is loading

即:非 IE 浏览器均不支持触发 IMG、SCRIPT 和 LINK 标记的内联 onreadystatechange 事件。

让后,下面将分析动态创建的 IMG、SCRIPT 标记的在各浏览器中能否触发 onreadystatechange 事件:

function loadJS(url) {
  var domScript = document.createElement('script');
  domScript.onreadystatechange = function() {
    var divElement = document.createElement('div');
    divElement.appendChild(document.createTextNode('readyState:'+ domScript.readyState +' 动态创建的 SCRIPT 标记可以触发 onreadystatechange 事件'));
    document.body.appendChild(divElement);
  }
  domScript.src = url;
  document.getElementsByTagName('head')[0].appendChild(domScript);
}
function loadIMG(url) {
  var domImage = document.createElement('img');
  domImage.onreadystatechange = function() {
    var divElement = document.createElement('div');
    divElement.appendChild(document.createTextNode('readyState:'+ domImage.readyState +' 动态创建的 IMG 标记可以触发 onreadystatechange 事件'));
    document.body.appendChild(divElement);
  }
  domImage.src = url;
  document.getElementsByTagName('head')[0].appendChild(domImage);
}
function loadCSS(url) {
  var domLink = document.createElement('link');
  domLink.onreadystatechange = function() {
    var divElement = document.createElement('div');
    divElement.appendChild(document.createTextNode('readyState:'+ domLink.readyState +' 动态创建的 LINK 标记可以触发 onreadystatechange 事件'));
    document.body.appendChild(divElement);
  }
  domLink.rel = 'stylesheet';
  domLink.type = 'text/css';
  domLink.href = url;
  document.getElementsByTagName('head')[0].appendChild(domLink);
}
window.οnlοad=function (){
  //执行动态加载外部 JS 文件
  loadJS('http://code.jquery.com/jquery-1.4.js');
  //执行动态加载图片文件
  loadIMG('w3c.png');
  //执行动态加载css文件
  loadCSS('../../../../../css/article.css');
}

各浏览器输出如下:

 IE6 IE7 IE8OperaFirefox Safari Chrome
IMGreadyState:complete 动态创建的 IMG 标记可以触发 onreadystatechange 事件readyState:undefined 动态创建的 IMG 标记可以触发 onreadystatechange 事件无内容输出
SCRIPTreadyState:loading 动态创建的 SCRIPT 标记可以触发 onreadystatechange 事件
readyState:loaded 动态创建的 SCRIPT 标记可以触发 onreadystatechange 事件
readyState:loaded 动态创建的 Script 标记可以触发 onreadystatechange 事件无内容输出
LINKreadyState:complete 动态创建的 LINK 标记可以触发 onreadystatechange 事件readyState:undefined 动态创建的 LINK 标记可以触发 onreadystatechange 事件无内容输出

可见,此次测试中,除 IE 浏览器外,Opera 对于动态创建的 IMG、SCRIPT 和 LINK 标记也可以触发 onreadystatechange 事件,但他对不同元素加载过程中触发该事件的频率以及 readyState 状态值的支持细节又不同于 IE。

【注】:对于 MSDN 中其他标记或对象在非 IE 浏览器中支持 onreadystatechange 事件的情况,本文将不再一一验证,读者如有兴趣可以自行测试。

解决方案

在现行 W3C 标准规范中仅有 XmlHttpRequest 对象中存在 onreadystatechange 事件 ( 请参考 XMLHttpRequest 规范 )。

对于其他元素或对象请慎用 onreadystatechange 事件,因为他只有 IE 浏览器支持,而 Opera 浏览器则只是部分支持。

如果使用 onreadystatechange 是为了处理脚本加载(回调)的问题,请参考 BX9013: 动态引入的外部 JS 文件在各浏览器中的加载顺序不一致 一文“解决方案”中的内容。


http://www.niftyadmin.cn/n/3045997.html

相关文章

编写可维护的 Gruntfile.js

load-grunt-tasks 插件 首先介绍下 load-grunt-tasks 这个插件。 我们一般都会把所有用到的插件以及插件的配置写到 Gruntfile.js 里面&#xff0c;对于小项目来说这个文件最终或许不是很大&#xff0c;但是对于大项目、有很多配置或者很多自定义任务的项目来说&#xff0c;最后…

java restful接口ajax_SSM RESTful ajax——开发Java Web

前段时间在参加学院里的一个比赛的时候和朋友一起弄了一个简单的网络论坛项目&#xff0c;使用的技术有ssm、mysql、ajax、jquery、html等。刚开始的时候打算前后端分离开发&#xff0c;由于以前没有经验&#xff0c;所以就摸索着写。项目中大概是前端编写好html&#xff0c;不…

使用 Named Pipes 创建有效的连接字符串

使用 Named Pipes 创建有效的连接字符串 SQL Server 2008 SQL Server 2005 默认 Microsoft SQL Server 实例侦听“named pipes”协议时&#xff0c;除非用户进行了更改&#xff0c;否则将使用 //./pipe/sql/query 作为管道名称。句点指示该计算机是本地计算机&#xff0c;pip…

数字推盘游戏java_最强大脑数字推盘游戏-最强大脑数字推盘游戏官方版 v1.0预约_手机乐园...

游戏简介最强大脑数字推盘游戏是一款根据同名综艺节目的挑战项目改变制作的益智闯关游戏。游戏中玩家你要走的就是将各个数字合理的进行移动与组合&#xff0c;而且是要在规则的限制下进行移动&#xff0c;这样一来你就能组出对应的数字图片的同时完成关卡的相关挑战要求。当然…

【志银】Dev-Cpp配置OpenGL图形库(成功版本:Dev-Cpp 5.7.1 MinGW 4.8.1)

★配置前须知&#xff1a;Dev-Cpp自带OpenGL的使用和OpenGL简介 (附Dev-Cpp下载地址&#xff1a;http://sourceforge.net/projects/orwelldevcpp/?sourcedirectory) OpenGL简介&#xff1a;OpenGL&#xff08;全写Open Graphics Library&#xff09;是一个功能强大&#xff0c…

Javascript内存泄漏原理

Javascript内存泄漏原理 1.何为内存泄漏&#xff1f; 内存泄漏是指分配给应用的内存不能被重新分配。一块被分配的内存既不能使用&#xff0c;又不能回收&#xff0c;直到浏览器进程结束就会产生内存泄露。在C中&#xff0c;因为是手动管理内存&#xff0c;内存泄露是经常出现的…

彻底解决 SQL Server 无法连接 连接失败

如何解决 SQL Server 2000 中的连接问题 http://support.microsoft.com/kb/827422/zh-cn本文能帮助您解决 Microsoft SQL Server 2000 的连接问题。本文描述了常见连接问题和所能采取的有助于解决连接问题的步骤。 SQL Server 2000 支持 SQL Server 实例和客户端应用程序间的多…

Javascript内存泄漏检测工具

Javascript内存泄漏检测工具 内存泄漏对开发者来说一般很难检测因为它们是由一些大量代码中的意外的错误引起的&#xff0c;但它在系统内存不足前并不影响程序的功能。这就是为什么会有人在很长时间的测试期中收集应用程序性能指标来测试性能。 最简单的检测内存泄漏的方式是用…