提问人: 提问时间:5/15/2009 最后编辑:Jonathan Leffler 更新时间:8/8/2011 访问量:1474
Jquery 模棱两可的 ajax 错误
Jquery ambiguous ajax error
问:
这是我的 ajax 调用的直觉。
function ajax(path, requestData, successCallBack, errorCallBack) {
return $.ajax({
error: function(xhr, textStatus, errorThrown)
ç(xhr, textStatus, errorThrown);
},
success: function(json){
successCallBack(json);
}
});
}
当进行ajax调用并且用户单击页面上的链接时,将调用我的errorCallBack。用户离开将导致 ajax 调用被终止。 当服务器上出现错误时,也会调用我的 errorCallBack 回调。
有没有办法区分两者?
谢谢!
答:
-1赞
nickf
5/15/2009
#1
检查 xhr 对象的属性。它应该在某处有 HTTP 响应代码。
1赞
gnarf
5/15/2009
#2
我在做一些事情时遇到了同样的问题......一个“已取消”的 $.ajax 请求(用户导航离开/点击停止)xhr.status == 0 而不是 200/404/etc...
评论
2赞
Adam A
8/8/2011
但是,这不会区分用户导航离开和完全无法访问的服务器。我不认为它有效。
1赞
curthipster
8/13/2009
#3
这是我用来实现 gnarf 和 nickf 答案的技术:
当用户通过刷新、单击链接或更改浏览器中的 URL 离开页面时,jQuery 将引发错误事件。可以通过实现 ajax 调用的错误处理程序并检查 xmlHttpRequest 对象来检测这些类型的错误:
$.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
});
3赞
Adam A
8/8/2011
#4
@colbeerhey的答案很好,但你可以更进一步。您仍然需要知道服务器是否真的无法访问。我在这里问了这个问题,但完整的答案是:
var running = true;
$(window).bind('beforeunload', function() { running = false; });
$.ajax({
/* ajax options omitted */
error: function (xmlHttpRequest, textStatus, errorThrown) {
var serverNotReached = xmlHttpRequest.readyState == 0 || xmlHttpRequest.status == 0;
if(serverNotReached && !running)
return; // it's not really an error, user clicked away
else if (serverNotReached)
// The server is down! You didn't get any response at all.
else
// Do normal error handling
});
请记住,onbeforeunload 只是一个事实上的标准(IE FF、Webkit 都处理它),所以如果你关心更晦涩的浏览器,这将会中断。
评论