Javascript 在IE9中中止AJAX请求时出错
我在我的项目中使用长轮询。项目运行时,其中一个长轮询请求正在等待服务器的响应。现在,当用户生成新模板时,我必须中止上一个长轮询调用并运行新的 在IE中中止会导致错误Javascript 在IE9中中止AJAX请求时出错,javascript,ajax,internet-explorer,internet-explorer-9,Javascript,Ajax,Internet Explorer,Internet Explorer 9,我在我的项目中使用长轮询。项目运行时,其中一个长轮询请求正在等待服务器的响应。现在,当用户生成新模板时,我必须中止上一个长轮询调用并运行新的 在IE中中止会导致错误 couldn't complete the operation due to error c00c023f 我不想使用Jquery,中止之前的请求非常重要。我试图尝试捕捉以防止显示此错误,但没有成功 当正常请求(非轮询请求)请求在几秒钟后没有到达服务器时,我也使用中止,然后我中止旧请求并发送新请求 我在数组中为每个请求存储xml
couldn't complete the operation due to error c00c023f
我不想使用Jquery,中止之前的请求非常重要。我试图尝试捕捉以防止显示此错误,但没有成功
当正常请求(非轮询请求)请求在几秒钟后没有到达服务器时,我也使用中止,然后我中止旧请求并发送新请求
我在数组中为每个请求存储xmlHttp对象
比如:array_XMLHttp.push(request1)代码>
我像这样中止它:array_XMLHttp[index_of_request].abort()代码>
我找不到IE9的任何解决方案,但它在所有其他浏览器上都能完美工作
更新:
我总是检查XMLHttp对象的状态和readyState,如下所示:
function checkResponse(xmlHttp){
xmlHttp.onreadystatechange=function(){
if(xmlHttp.readyState==4){
if(xmlHttp.status==200){
// Request received
}
}
}
}
下面是我如何启动请求的
// to start new XmlHttp object
var xmlHttp=crXH();
// add the request to array to be aborted later if required
array_XMLHttp.push(request1);
// initiate the callback
checkResponse(xmlHttp);
//send the request to server
send(xmlHttp);
当我中止时:
// The problem now the callback function will not read (undefined) the new property added to the aborted object.
array_XMLHttp[index_of_request].aborted = true;
array_XMLHttp[index_of_request].abort();
谢谢你的帮助 将我们漫长的讨论编成一个答案
根据我在本主题中的发现(这在IE中不是一个罕见的问题),IE不希望您在调用.abort()
后访问xmlHttp
对象上的标准属性,但它仍然会触发一些onreadystatechange
事件,导致您尝试访问这些标准属性,从而导致错误
解决方法是在调用.abort()
时,在xmlHttp
对象上设置您自己的属性,并在readystatechange
处理程序中,首先检查您自己的.aborted
属性,如果已设置,然后您就知道调用已中止,并且没有检查可能导致问题的其他属性
因此,如果您的xmlHttp
对象被称为x
,那么您应该这样做:
x.readystatechange = function() {
if (!x.aborted) {
if(xmlHttp.readyState==4){
if(xmlHttp.status==200){
// Request received
}
}
}
}
并且,当您要中止时:
x.aborted = true;
x.abort();
可能重复:可能的解决方法:IE中有很多关于错误c00c012f和Ajax中止的文章。谷歌搜索显示了数百篇文章。据我所知,共同的主题是本文所示的解决方案:。问题是一旦您中止,即触发onreadystatechange,但如果您尝试访问对象上的公共属性,如.readyState
或.status
,则可能引发异常。解决方法是在中止时设置您自己的.aborted
属性,并首先检查该属性,以避免在中止时检查其他异常引发属性。您没有包含足够的相关代码,我无法理解您请求帮助的内容。调用.abort()
时,您将.aborted
属性放在xmlHttp
对象上,此时您必须访问该属性,并且在checkResponse()
中也可以访问该属性,这是您需要它的两个位置。像xmlHttp对象这样的对象不会作为副本传递。因此,您在回调中看到的对象与其他地方存在的对象完全相同。它是否作为参数传递给函数并不重要。该函数参数仍然指向原始对象,并且应该显示属性。你真的试过了吗?它很有魅力!非常感谢您帮助我解决这个问题。感谢您提供的精彩提示。