`

IE6 IE7 IE8 对 onreadystatechange 事件的扩充

阅读更多

问题描述

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 IE8 Firefox Safari Chrome Opera IMG SCRIPT LINK
The image is loading.
The image readyState: complete
The image is loading.
The script is loading.
The script readyState: loading
The script readyState: loaded
The script readyState: complete
The scirpt is loading
The 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.onload=function (){
  //执行动态加载外部 JS 文件
  loadJS('http://code.jquery.com/jquery-1.4.js');
  //执行动态加载图片文件
  loadIMG('w3c.png');
  //执行动态加载css文件
  loadCSS('../../../../../css/article.css');
}

各浏览器输出如下:

  IE6 IE7 IE8 Opera Firefox Safari Chrome IMG SCRIPT LINK
readyState:complete 动态创建的 IMG 标记可以触发 onreadystatechange 事件 readyState:undefined 动态创建的 IMG 标记可以触发 onreadystatechange 事件 无内容输出
readyState:loading 动态创建的 SCRIPT 标记可以触发 onreadystatechange 事件
readyState:loaded 动态创建的 SCRIPT 标记可以触发 onreadystatechange 事件
readyState:loaded 动态创建的 Script 标记可以触发 onreadystatechange 事件 无内容输出
readyState: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 文件在各浏览器中的加载顺序不一致 一文“解决方案”中的内容。

分享到:
评论

相关推荐

    firefox3中onreadystatechange事件不会触发

    在Firefox 3中,`onreadystatechange`事件是一个常见的JavaScript事件,用于监测XMLHttpRequest对象的状态变化。然而,根据标题所示的问题,这个事件似乎在特定环境下没有按照预期的方式触发。这可能是由于Firefox 3...

    仅IE9/10同时支持script元素的onload和onreadystatechange事件分析

    如下 代码如下: &lt;!... &lt;head&gt; &lt;meta charset=”utf-8″&gt; &lt;title&gt;IE9/10同时支持script元素的onload和onreadystatechange事件&lt;... 结果: IE6/7/8 : 弹出2 IE9/10 : 弹出2,1 F

    各浏览器对link标签onload/onreadystatechange事件支持的差异分析

    - IE6、IE7、IE8和IE9全面支持link标签的onreadystatechange事件。此事件会在link元素的readyState属性改变时触发,特别是在加载过程中,当readyState由"loading"变为"complete"时,会触发两次事件,分别对应加载...

    AJAX – onreadystatechange 事件

    `onreadystatechange` 事件是一个事件处理器,每当 `XMLHttpRequest` 对象的 `readyState` 属性发生变化时,就会触发这个事件。`readyState` 是一个记录请求进度的属性,它会随着请求的五个不同阶段而改变: 1. 0: ...

    ajax兼容IE,FF问题

    在处理响应时,IE的`onreadystatechange`事件在所有状态改变时都会触发,而Firefox只在状态改变到4(即完成)时触发。因此,我们通常需要在事件处理函数中检查`readyState`和`status`来确定是否完成了请求。 ```...

    Javascript在IE和FireFox中的不同表现

    - IE的`onreadystatechange`事件在某些情况下处理方式与Firefox不同。 7. **定时器**: - `setTimeout`和`setInterval`在IE中可能存在精度问题,而Firefox通常更准确。 8. **错误处理**: - IE使用`try...catch...

    ie进度条

    开发者可能需要利用特定的事件(如onreadystatechange或progress事件)来监控页面加载状态,并使用JavaScript动态更新进度条的状态。对于IE8及更早版本,可能需要使用ActiveX对象或者自定义的解决方案,因为它们不...

    WEB开发 之 AJAX - onreadystatechange 事件.docx

    `onreadystatechange`事件是AJAX中的关键部分,它使得开发者能够在XMLHttpRequest对象的状态发生变化时执行相应的处理程序。 XMLHttpRequest对象是AJAX的核心,它提供了与服务器进行通信的能力。`...

    xmlHttp ie6下不跨域还提示没有权限,ie8下不会有这错误

    此问题的标题指出“xmlHttp ie6下不跨域还提示没有权限,ie8下不会有这错误”,这涉及到XMLHttpRequest(通常称为XHR)对象在IE6与IE8之间处理跨域请求的差异,以及URL长度限制。 首先,让我们来理解什么是跨域。...

    iframe的onreadystatechange事件在firefox下的使用

    `onreadystatechange`事件在IE中的工作原理是监听`iframe`内容的DOM加载状态,当状态变化时触发回调函数。而Firefox等现代浏览器则使用`onload`事件来检测内容是否完全加载,包括图像、脚本等所有资源。因此,在Fire...

    鼠标事件大全 包括不同浏览器是否支持 鼠标事件非常完整

    6. **onReadyStateChange**:对象就绪状态发生变化时触发。IE4、N及O版本支持。 通过上述详尽的事件列表及其在不同浏览器中的支持情况,开发者可以更好地规划和实现网页的交互功能,确保用户体验的一致性和优化。在...

    ie判断图片加载成功代码

    然而,IE浏览器(尤其是早期版本)对事件处理的机制略有不同,它不支持直接在`onload`事件上设置函数。因此,我们需要使用不同的方法来处理。以下是一个在IE中判断图片加载成功的方法: ```javascript function ...

    JS实现单图片预览,兼容IE、火狐

    我们首先需要了解的是,浏览器对文件API的支持程度不同,特别是对于IE,我们需要采用一些特殊的技术来处理。 1. **FileReader API** FileReader API是HTML5引入的一个重要特性,允许我们读取文件内容,包括图片。...

    深入解析IE11中被废止的JS方法.pdf

    此外,IE11废弃了一些其他特性,例如expression和filters(用于CSS动态效果),eval()的IE版本,window.scrollBy()和window.scrollTo()用于滚动窗口,onreadystatechange事件,以及readyState属性来检查脚本加载状态...

    JS读取本地XML(支持IE和火狐)

    在IE7及以上版本和所有现代浏览器中,都支持XMLHttpRequest。不过,由于IE6的限制,我们需要使用ActiveXObject来兼容它。 1. **创建XMLHttpRequest对象** 在IE6及以下版本,我们需要创建ActiveXObject实例: ```...

    js事件大全汇总111

    通过以上对JavaScript事件的详细介绍,我们能够了解到不同事件的触发条件和应用场景,这对于开发高质量的Web应用程序具有重要意义。开发者可以根据实际需求选择合适的事件处理方式,提高用户体验。

Global site tag (gtag.js) - Google Analytics