当用户点击刷新时处理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调用。
nisanth074和Peter V.Mørch的联合版本的答案,为我工作。
例:
var isPageBeingRefreshed = false; $(window).on('beforeunload', function(){ isPageBeingRefreshed = true; }); $.ajax({ // Standart AJAX settings }).error(function(){ if (!isPageBeingRefreshed) { // Displaying error message } });