离开页面时如何处理jQuery ajax发布错误

Posted

技术标签:

【中文标题】离开页面时如何处理jQuery ajax发布错误【英文标题】:How to handle jQuery ajax post error when navigating away from a page 【发布时间】:2012-03-02 23:52:13 【问题描述】:

有没有办法在 JQuery 中处理来自 ajax 请求的错误,这样当用户离开页面时,产生的错误会被忽略?

$(document).ready(function() 
 $.ajax( 
    url:'/server/url/',
    type: 'POST',
    data: some..data,
    success:function(response)  do stuff with response ,
    error: function(xhr, textStatus, errorThrown) 
           // Don't raise this alert if user has navigated away from the page
           alert('error');
    
);

我很好奇是否有人知道处理此问题的干净方法?我知道您可以在 $(window).bind("beforeunload", function()) 方法中创建一些逻辑,但我希望有一种方法可以在不这样做的情况下处理这种情况,因为 Chrome 似乎不再支持它。例如,在这种情况下是否返回特定错误?

谢谢。

【问题讨论】:

由于调用是对服务器的,我认为它没有足够的知识来根据用户是否离开该页面而返回不同的响应。有没有什么地方可以提供这种行为的例子?在您离开该页面后,来自另一个页面的脚本会继续运行,这似乎很奇怪。 认为脚本实际上停止运行,并且由于过早终止而引发错误。 一旦您离开,您的 AJAX 调用就会进入位桶。客户端上不再有侦听器来接收来自该请求的任何消息。 正在调用错误回调。但是,xhr.status 为 0,大概可以用来过滤这个条件。 jQuery AJAX fires error callback on window unload? 的可能重复项 【参考方案1】:

看起来这个问题的答案是检查 jqXHR.status。 XMLHttpRequest spec 概述了设置状态的这些步骤:

status 属性必须返回运行这些步骤的结果:

    如果状态为 UNSENT 或 OPENED,则返回 0 并终止这些步骤。

    如果设置了错误标志,则返回 0 并终止这些步骤。

    返回 HTTP 状态码。1

另请注意: 错误标志指示某种类型的网络错误或请求中止。它最初是未设置的,并在 DONE 状态期间使用。

据我了解,此代码检查应该可以解决问题:

    if (xhr.status == 0)
        alert('error');

1https://web.archive.org/web/20120204040047/http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute

【讨论】:

正是我正在寻找的答案。绑定新事件是过度设计的。 有没有办法区分某人离开页面和其他网络问题(超时、找不到主机等)的情况? This 文章说到响应返回时,页面已经卸载,回调函数将不再存在,那么错误回调如何工作可靠吗? 不应该是xhr.status == 0吗? 错误:函数(xhr,textStatus,errorThrown)如果(xhr.readyState === 4)警报(错误); 【参考方案2】:

检查状态对我不起作用,但是

// Ignore incomplete requests, likely due to navigating away from the page
if (jqXHR.readyState < 4) 
    return true;
 

在错误处理程序中做了(4 完成)。

【讨论】:

如果服务器进程存在,jqXHR.readyState 的值为 0。这实际上应该去错误处理,因为它不是用户导航离开的情况。 我不能同意。我正在使用当前的 FireFox 和 jQuery v2.0.0。当我在 ajax 请求期间点击链接时,ajax 请求以 jqXHR.readyState = 4 和 jqXHR.status = 404 结束。【参考方案3】:

我也曾多次处理过这个问题。

我建议绑定到$(window).unload 事件,在某处设置一些变量,例如在您的命名空间 (App.unloading = true) 中,然后在 ajax 错误回调中对其进行测试。

见http://api.jquery.com/unload/

【讨论】:

这似乎不适用于所有浏览器:code.google.com/p/chromium/issues/detail?id=4422 请参阅***.com/questions/1370322/… 了解替代方法。也许将卸载事件和标志与状态检查结合起来就足够了。

以上是关于离开页面时如何处理jQuery ajax发布错误的主要内容,如果未能解决你的问题,请参考以下文章

使用jquery mobile时如何处理手机中的表单导航后退按钮

发生管道损坏时如何处理 AJAX 响应?

[当PHP代码失败但发送200时如何处理AJAX?

页面刷新时如何处理来自同一页面中两个模式的值

运行 Mongoose 时执行 ajax 调用时如何处理 Node.js 发现

使用带有textarea文本的jQuery追加时如何处理回车