Ajax:如何防止jQuery在执行xmlHttpRequest.abort()之后调用success事件;

7wp*_*7wp 9 jquery xmlhttprequest

使用jQuery的$ .ajax()函数.如果请求被故意中止,或者服务器关闭(没有响应),则会出现相同的结果;

这就是在xmlHttpRequest.status = 0xmlHttpRequest.readyState = 4的情况下触发"成功"处理程序.

(我通过关闭IIS模拟失败的请求,然后针对已经"关闭"的网站执行xmlHttpRequest)

所以我的问题是如何确定中止请求或由于服务器没有响应而导致真正失败的请求(因为服务器可能已关闭)之间的区别,因为两种情况似乎都给我相同的状态/ readyState?

编辑 更准确我想知道如何在ajax上调用.abort()函数后阻止调用"success"处理程序.

我已经重新措辞,以反映这一点.

Pie*_*ing 8

jQuery <1.5

对于jQuery <1.5,我提出了以下解决方案:

var request = $.ajax( /* ... */ );

// ...

request.onreadystatechange = function () {};
request.abort();
Run Code Online (Sandbox Code Playgroud)

所以,基本上我做什么,就是去掉success之前调用回调处理程序abort().

这就像一个魅力.

jQuery> = 1.5:

从jQuery 1.5开始,$.ajax(), $.get(), …函数返回jXHR对象(api文档)而不是xmlHttpRequest对象.因此,您不能简单地覆盖xmlHttpRequest.onreadystatechange()处理程序.

这就是说,jXHR.abort()负责不调用success回调处理程序.因此,打电话就足够了jXHR.abort().

您不一定需要更新以前的代码,因为设置onreadystatechangejXHR只会完全没有效果.

长话短说,从jQuery 1.5开始,这将做:

var jxhr = $.ajax( /* ... */ );

// ...

jxhr.abort();
Run Code Online (Sandbox Code Playgroud)

  • 只有在你之后"中止"时才有效.如果你再次调用`jxhr`之前尝试`abort`,它就不起作用了. (2认同)