从这类问题的分支中,我希望包装jquery的$.Ajax()方法,以便在一个位置提供错误处理,然后应用程序的所有远程调用都将自动使用它。
简单的方法是简单地创建一个新名称,类似于$.get()和$.post()如何实现$.ajax()的外观。不过,我希望重用名称$.ajax(),这样我们就可以使用标准jquery语法保留其余代码,从而避免了添加了自己的错误处理这一事实。这是可行的和/或很好的实现,还是可能是一个可怕的想法?
编辑:到目前为止的响应表明.ajaxerror()是前进的道路。我知道这将捕获400和500个级别的错误,但是否有一种方法(使用此事件处理程序或其他方法)也捕获302个重定向?我正在尝试处理重定向到登录页面的响应,但我们希望截获当它是XHR请求时的重定向,允许用户取消操作,而不是强制它们自动转发。
另一方面,对未登录的Ajax请求的响应可能返回401而不是302。不管怎样,都是值得思考的食物。
你可能想看看$.ajaxError。
$(document).ajaxError(function myErrorHandler(event, xhr, ajaxOptions, thrownError) {
alert("There was an ajax error!");
});
jquery提供了一系列附加全局处理程序的其他方法。
要回答您的编辑,您可以使用$.ajaxSuccess捕获成功的Ajax请求,也可以使用$.ajaxComplete捕获所有(成功和失败)。您可以从xhr参数获取响应代码,例如
$(document).ajaxComplete(function myErrorHandler(event, xhr, ajaxOptions, thrownError) {
alert("Ajax request completed with response code" + xhr.status);
});
@Marc L:编辑以匹配您的额外信息。另外,您可能会发现这很有趣:stackoverflow.com/questions/199099/…
试试$(document).ajaxError(…);——用$.ajaxError(...)对我没用。
jquery有一个名为$.Ajaxsetup()的简便方法,它允许您设置应用于随后所有基于jquery的Ajax请求的选项。通过将此方法放置在主文档就绪功能中,所有设置都将自动应用于其他功能,并位于一个位置。
$(function () {
//setup ajax error handling
$.ajaxSetup({
error: function (x, status, error) {
if (x.status == 403) {
alert("Sorry, your session has expired. Please login again to continue");
window.location.href ="/Account/Login";
}
else {
alert("An error occurred:" + status +"nError:" + error);
}
}
});
});
参考:https://cypressnorth.com/programming/global-ajax-error-handling-with-jquery/
我认为这比Ajaxerror()更好,因为不需要将监听器绑定到DOM,并且在您说Global时更合理。
@wancieho see全局回调函数应该用它们各自的全局Ajax事件处理程序方法设置-.ajaxStart()、.ajaxStop()、.ajaxComplete()、.ajaxerror()、.ajaxSuccess()、.ajaxSend()-而不是在$.ajaxSetup()的选项对象中。从jquery 1.9开始,jquery全局Ajax事件的所有处理程序,包括用.ajaxerror()方法添加的处理程序,都必须附加到文档中。
为难看的格式道歉,只能在评论中做这么多吗??
实际上,jquery仅为此目的提供了hook,.ajaxError()。当来自页面的Ajax请求以错误完成时,将调用与$ajaxError()绑定的任何和所有处理程序。指定选择器允许您引用.ajaxError()处理程序内部的this。
要使用它来处理页面上的所有Ajax请求错误,并使用this指向document,可以这样做:
$(document).ajaxError(function(event, request, settings){
alert("Error requesting page:" + settings.url);
});
为了澄清,Ajaxerror处理所有Ajax故障,而不仅仅是那些与选择器匹配的故障。使用选择器只允许您在回调中使用this关键字来引用该元素。
我觉得这是个坏主意。我认为包装$.ajax是好的,但你是在说重新定义它。任何不知道这一点的人都会得到意想不到的结果。
正如其他人提到的,将一个处理程序绑定到$.ajaxError是一种可行的方法。