当用户点击刷新时处理Ajax错误

我很抱歉,如果这是我应该能够查找的东西。 我想要的所有术语都是超载的

这里是我的问题:当我打开一个页面,它引发了一系列的Ajax调用。 如果我然后按Shift +刷新,所有这些Ajax调用被视为错误,并显示其整个页面本身之前重新加载它们的错误消息对话框。

所以错误是由客户端触发 – 无论如何,我可以找出是否是这样的情况下,所以我可以忽略它? 例如在xmlhttprequest,或在ajax函数(我使用jQuery的btw)

[这是前一个答案的编辑,这个问题我从此得到了解决]

当用户通过刷新,点击链接或在浏览器中更改URL时,jQuery抛出错误事件。 您可以通过为ajax调用实现一个error handling程序并检查xmlHttpRequest对象来检测这些types的错误:

$.ajax({ /* ajax options omitted */ error: function (xmlHttpRequest, textStatus, errorThrown) { if(xmlHttpRequest.readyState == 0 || xmlHttpRequest.status == 0) return; // it's not really an error else // Do normal error handling }); 

有几种build议的方法来检测这一点:

  • 有几个build议使用beforeunload处理程序来设置布尔标志,以便error handling程序可以知道该页面正在被卸载(请参阅下面的相关/重复的post列表)。 这很好,除了iOS上的移动Safari不支持beforeunload事件 。

  • Sachindra提出了一个方法,它不是立即触发错误函数,而是在setTimeout(..., 1000)延迟一秒。 这样,在error handling程序被调用的时候页面实际上已经消失了。 “好机会”就是。 我敢打赌,如果我有一个巨大的页面,例如很多<input> ,卸载可能需要1秒多的时间,然后error handling程序可能会触发。

因此,我build议可靠地检测之前的beforeunload支持的组合,如果beforeunload不支持( 咳嗽 iPad / iPhone 咳嗽 )恢复到Sachindra的延迟技巧。

查看完整的解决scheme之前,检查和所有在这个jsfiddle 。

对于jQuery 2.x而言 ,情况似乎比1.x好一点 ,但是2.x也好像有些小问题,所以我仍然觉得这个build议比较谨慎。

PS:还有一些关于testingXHR / jqXHR对象中某些字段的build议。 ( 这里和这里 )。 在长时间运行的AJAX调用中,我还没有find区分用户导航和重新启动Web服务器的组合,因此我没有发现这种方法对我有用。

这也是这些相关/重复堆栈溢出问题的答案:

  • jQuery的AJAX火灾窗口卸载错误callback?
  • 当请求由于浏览器重新加载而失败时,$ .ajax调用成功处理程序
  • 如何最好地处理jquery ajax调用期间由用户点击链接引起的错误
  • 检测到一个jQuery.ajax调用失败,因为页面正在重新加载?

和堆栈溢出以外的这些post:

  • 由于页面重新加载,处理AJAX错误的正确方法是什么?
  • 如何区分用户中止的AJAX调用和错误| 我喜欢东西。
 var isPageBeingRefreshed = false; window.onbeforeunload = function() { isPageBeingRefreshed = true; }; $.ajax({ error: function (xhr, type, errorThrown) { if (!xhr.getAllResponseHeaders()) { xhr.abort(); if (isPageBeingRefreshed) { return; // not an error } } } }); 

上述技术不适用于定期刷新的页面(例如每半秒)。 我发现通过延迟error handling过程很less的时间可以避免刷新页面造成的错误。

例:

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

在此之上

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

事件可以用于不太经常刷新ajax调用。

nisanth074Peter V.Mørch的联合版本的答案,为我工作。

例:

 var isPageBeingRefreshed = false; $(window).on('beforeunload', function(){ isPageBeingRefreshed = true; }); $.ajax({ // Standart AJAX settings }).error(function(){ if (!isPageBeingRefreshed) { // Displaying error message } });