当请求因浏览器重新加载而失败时,jQuery $ .ajax调用成功处理程序

我有以下代码:

$.ajax({ type: "POST", url: url, data: sendable, dataType: "json", success: function(data) { if(customprocessfunc) customprocessfunc(data); }, error: function(XMLHttpRequest, textStatus, errorThrown){ // error handler here } }); 

我有一个定时器,经常发出AJAX请求。 如果我没有收到“数据”中的任何内容,我会向用户显示一条错误消息 – 这意味着服务器上出现了问题。

问题是当用户在AJAX调用进行时重新加载页面时。 我可以在Firebug中看到AJAX调用失败(URL显示为红色且未显示HTTP状态)所以我希望jQuery将停止请求或至少转到error handling程序。 但它转到成功处理程序并在’data’变量中传递null。

因此,当用户重新加载页面时,有时他可以看到关于未知错误的大红色消息(因为数据为空)。

有没有办法让jQuery在完全重新加载时中止请求,或者至少不调用我的成功函数? 我无法在成功处理程序中知道数据为空的原因 – 它是否从服务器中清空或者由于重新加载而中止调用。

您可以在页面上使用onbeforeunload事件:将其链接到清除所有AJAX请求的函数。

统计数据很奇怪,如果调用失败,你就会收到“成功”。但你可以尝试通过监听完成事件来覆盖行为(这里只是从我的测试框架中复制粘贴代码)

 $.ajax( { url: url, type: type, processData: false, contentType: 'application/json; charset=utf-8', data: JSON.stringify(data), dataType: 'json', complete: function (result) { if (result.status == 404) { ok(false, '404 error'); } else { callback($.parseJSON(result.responseText)); } } }); 

结果是XMLHttpRequest对象,因此您可以分析它的实际状态并决定是继续还是不继续。

onbeforeunlaod技术不适用于定期刷新页面(例如每半秒)。 我已经发现,使用延迟error handling过程少量时间可以避免刷新页面引起的错误。

例:

 $.ajax(...) .success(...) .error(function(jqXHR) { setTimeout(function() { // error showing process }, 1000); }); 

在此之上

window.onbeforeunload = function(){//停止ajax调用}

事件可用于较少刷新ajax调用。