Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在IE9中中止AJAX请求时出错_Javascript_Ajax_Internet Explorer_Internet Explorer 9 - Fatal编程技术网

Javascript 在IE9中中止AJAX请求时出错

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

我在我的项目中使用长轮询。项目运行时,其中一个长轮询请求正在等待服务器的响应。现在,当用户生成新模板时,我必须中止上一个长轮询调用并运行新的

在IE中中止会导致错误

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对象这样的对象不会作为副本传递。因此,您在回调中看到的对象与其他地方存在的对象完全相同。它是否作为参数传递给函数并不重要。该函数参数仍然指向原始对象,并且应该显示属性。你真的试过了吗?它很有魅力!非常感谢您帮助我解决这个问题。感谢您提供的精彩提示。