我们使用jQuery的全局ajaxError()处理程序来警告用户任何AJAX失败:
$(document).ajaxError(function() {
$("There was a network or server error. Please try again later.").dialog({
title: "Error",
modal: true,
resizable: false,
buttons: { 'Ok': function() { (this).dialog("close"); } }
});
});
不幸的是,如果用户在完成加载之前离开页面,也会触发此全局错误处理程序。以下是重现错误的步骤:
我们知道如何在访问新页面的用户直接导致错误时触发ajaxError()吗?
更新:在结合评论中的建议后,现在是我的代码:
// I added a 3 second delay to our error dialog, enough time
// for the user to leave for a new page:
$(document).ajaxError(function() {
setTimeout(my_error_handler, 3000);
});
// Warn user before leaving page if AJAX is still loading.
// Not sure I'll keep this:
$(document).ajaxStart(function() {
ajaxing = true;
});
$(document).ajaxStop(function() {
ajaxing = false;
});
window.onbeforeunload = function() {
if (typeof(ajaxing) != 'undefined' && ajaxing) {
return "Page elements are still loading!";
}
};
答案 0 :(得分:15)
是的,如果用户导航到另一个页面,xhr将中止,这实际上是一次不成功的通信。一个解决方案是为onbeforeunload
事件注册一个监听器,并在那里取消绑定ajaxError
,基本上说:用户即将离开页面,所以我不希望被告知ajax错误可能会跟着。
有些网站,比如GMail,反过来说:如果你仍然有一些ajax请求未决,你会尝试离开页面,它会提示你有一些进程仍在运行,并让用户决定是否在请求完成之前留在网站上,或者继续离开。
答案 1 :(得分:10)
基于David Hedlund上面的回答,这里的代码对我有用:
//enable global ajax error handling
$(document).ajaxError(function (event, request, settings) {
//your error handling code here
});
//user leaving page so ignore any unfinished ajax loads
$(window).bind('beforeunload', function () {
$(document).unbind('ajaxError');
});
我从jquery ajaxError documentation的评论部分获得了'ajaxError'
规范。我必须将beforeunload
绑定到$(window)
才能支持chrome(IE正常处理文档)。当我绑定到.ajaxError
时,$(window)
没有触发,所以这就是我有这个窗口/文档解决方案的原因。