问题描述
onreadystatechange 事件通常用在基于 XMLHttpRequest 对象的 AJAX 应用中,当的该对象的 load state 改变时,会触发此事件。
但在 IE 中 onreadystatechange 事件是其私有实现的,用于数据加载的 IMG、SCRIPT 和 LINK 标记,常常被误用 onreadystatechange 事件而导致在非 IE 浏览器中无法得到预期结果。
造成的影响
onreadystatechange 事件处理在各浏览器支持不一致,可能会导非预期结果。
受影响的浏览器
问题分析
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>
在各浏览器输出如下:
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'); }
各浏览器输出如下:
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 文件在各浏览器中的加载顺序不一致 一文“解决方案”中的内容。
相关推荐
在Firefox 3中,`onreadystatechange`事件是一个常见的JavaScript事件,用于监测XMLHttpRequest对象的状态变化。然而,根据标题所示的问题,这个事件似乎在特定环境下没有按照预期的方式触发。这可能是由于Firefox 3...
如下 代码如下: <!... <head> <meta charset=”utf-8″> <title>IE9/10同时支持script元素的onload和onreadystatechange事件<... 结果: IE6/7/8 : 弹出2 IE9/10 : 弹出2,1 F
- IE6、IE7、IE8和IE9全面支持link标签的onreadystatechange事件。此事件会在link元素的readyState属性改变时触发,特别是在加载过程中,当readyState由"loading"变为"complete"时,会触发两次事件,分别对应加载...
`onreadystatechange` 事件是一个事件处理器,每当 `XMLHttpRequest` 对象的 `readyState` 属性发生变化时,就会触发这个事件。`readyState` 是一个记录请求进度的属性,它会随着请求的五个不同阶段而改变: 1. 0: ...
在处理响应时,IE的`onreadystatechange`事件在所有状态改变时都会触发,而Firefox只在状态改变到4(即完成)时触发。因此,我们通常需要在事件处理函数中检查`readyState`和`status`来确定是否完成了请求。 ```...
- IE的`onreadystatechange`事件在某些情况下处理方式与Firefox不同。 7. **定时器**: - `setTimeout`和`setInterval`在IE中可能存在精度问题,而Firefox通常更准确。 8. **错误处理**: - IE使用`try...catch...
开发者可能需要利用特定的事件(如onreadystatechange或progress事件)来监控页面加载状态,并使用JavaScript动态更新进度条的状态。对于IE8及更早版本,可能需要使用ActiveX对象或者自定义的解决方案,因为它们不...
`onreadystatechange`事件是AJAX中的关键部分,它使得开发者能够在XMLHttpRequest对象的状态发生变化时执行相应的处理程序。 XMLHttpRequest对象是AJAX的核心,它提供了与服务器进行通信的能力。`...
此问题的标题指出“xmlHttp ie6下不跨域还提示没有权限,ie8下不会有这错误”,这涉及到XMLHttpRequest(通常称为XHR)对象在IE6与IE8之间处理跨域请求的差异,以及URL长度限制。 首先,让我们来理解什么是跨域。...
`onreadystatechange`事件在IE中的工作原理是监听`iframe`内容的DOM加载状态,当状态变化时触发回调函数。而Firefox等现代浏览器则使用`onload`事件来检测内容是否完全加载,包括图像、脚本等所有资源。因此,在Fire...
6. **onReadyStateChange**:对象就绪状态发生变化时触发。IE4、N及O版本支持。 通过上述详尽的事件列表及其在不同浏览器中的支持情况,开发者可以更好地规划和实现网页的交互功能,确保用户体验的一致性和优化。在...
然而,IE浏览器(尤其是早期版本)对事件处理的机制略有不同,它不支持直接在`onload`事件上设置函数。因此,我们需要使用不同的方法来处理。以下是一个在IE中判断图片加载成功的方法: ```javascript function ...
我们首先需要了解的是,浏览器对文件API的支持程度不同,特别是对于IE,我们需要采用一些特殊的技术来处理。 1. **FileReader API** FileReader API是HTML5引入的一个重要特性,允许我们读取文件内容,包括图片。...
此外,IE11废弃了一些其他特性,例如expression和filters(用于CSS动态效果),eval()的IE版本,window.scrollBy()和window.scrollTo()用于滚动窗口,onreadystatechange事件,以及readyState属性来检查脚本加载状态...
在IE7及以上版本和所有现代浏览器中,都支持XMLHttpRequest。不过,由于IE6的限制,我们需要使用ActiveXObject来兼容它。 1. **创建XMLHttpRequest对象** 在IE6及以下版本,我们需要创建ActiveXObject实例: ```...
通过以上对JavaScript事件的详细介绍,我们能够了解到不同事件的触发条件和应用场景,这对于开发高质量的Web应用程序具有重要意义。开发者可以根据实际需求选择合适的事件处理方式,提高用户体验。