jquery Ajaxerror handling忽略中止

我想有一个全球性的AJAX调用error handling方法,这是我现在有:

$.ajaxSetup({ error: function (XMLHttpRequest, textStatus, errorThrown) { displayError(); } }); 

我需要忽略aborted的错误。 errorThrown为null, textStatuserror 。 我如何检查aborted

我今天不得不面对同样的用例。 我正在使用的应用程序有这些长时间运行的ajax调用,可以被1)用户导航或2)某种临时连接/服务器故障中断。 我想error handling程序只运行连接/服务器故障,而不是用户导航。

我第一次尝试Alastair Pitts的答案,但它没有工作,因为中止请求和连接失败设置状态码和readyState为0.接下来,我试着sieppl的答案; 也没有工作,因为在这两种情况下,没有给出答复,因此没有标题。

我唯一的解决scheme是为window.onbeforeunload设置一个监听器,该监听器设置一个全局variables来指示页面已经被卸载。 error handling程序可以检查,只有在页面还没有被卸载时才调用error handling程序。

 var globalVars = {unloaded:false}; $(window).bind('beforeunload', function(){ globalVars.unloaded = true; }); ... $.ajax({ error: function(jqXHR,status,error){ if (globalVars.unloaded) return; } }); 

在现代的jQuery中,你可以检查request.statusText是否等于'abort'

 error: function (request, textStatus, errorThrown) { if (request.statusText =='abort') { return; } } 

我发现的是,当有一个中止的请求, status和/或readyState等于0

在我的全局error handling程序中,我在方法的顶部检查:

 $(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError) { //If either of these are true, then it's not a true error and we don't care if (jqXHR.status === 0 || jqXHR.readyState === 0) { return; } //Do Stuff Here }); 

我发现这对我来说是完美的。 希望这可以帮助你,或任何其他谁跑到这:)

你会想看看传递给你的错误函数的textStatus参数。 根据http://api.jquery.com/jQuery.ajax/ ,它可以取值“成功”,“未修改”,“错误”,“超时”,“中止”或“parsererror”。 “中止”显然是你想检查的。

更长的音符在这里: jquery-gotcha-error-callback-triggered-xhr-abort

 $(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) { if (!jqXHR.getAllResponseHeaders()) { return; } }); 

build立在Alastair Pitts'a的答案 ,你也可以做到这一点有更多的信息:

 $(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError) { { if (jqXHR.status === 0) { alert('Not connect.\n Verify Network.'); } else if (jqXHR.status == 404) { alert('Requested page not found. [404]'); } else if (jqXHR.status == 500) { alert('Internal Server Error [500].'); } else if (exception === 'parsererror') { alert('Requested JSON parse failed.'); } else if (exception === 'timeout') { alert('Time out error.'); } else if (exception === 'abort') { alert('Ajax request aborted.'); } else { alert('Uncaught Error.\n' + jqXHR.responseText); } } }); 

因为bluecollarcodecode答案不适用于由javascript中止的Ajax请求,这里是我的解决scheme:

 var unloaded = false; ... $(window).bind('beforeunload', function(){ unloaded = true; }); $(document).ajaxError(function(event, request, settings) { if (unloaded || request.statusText == "abort") { return; } ... } 

例如

 handler = jQuery.get("foo") handler.abort() 

现在将被ajaxError处理程序忽略

我在这里遇到了同样的问题,我做的解决scheme是在调用abort()之前设置一个“中止”variables,如下所示:

 aborting = true; myAjax.abort(); 

并且只显示ajax请求的error handling程序的错误,如果abort不正确。

 $.ajax({ [..] error: function() { if ( !aborting ) { // do some stuff.. } aborting = false; } });