分析this one之类的问题,我想要包装jQuery的$ .ajax()方法,以便我可以在一个位置提供错误处理,然后由所有应用程序的远程自动使用调用
简单的方法是简单地创建一个新名称,类似于$ .get()和$ .post()如何实现$ .ajax()的外观。但是,我希望重用名称$ .ajax(),以便我们可以使用标准的jQuery语法保留其余代码,从中隐藏我们添加了自己的错误处理的事实。这是实际的和/或好的,或者可能是一个可怕的想法?
编辑:到目前为止的回复表明.ajaxError()是要走的路。我知道这会捕获400和500级别的错误,但有没有办法(使用此事件处理程序或其他方式)捕获302重定向?我正在尝试处理重定向到登录页面的响应,但我们希望在XHR请求时拦截该重定向,允许用户取消操作而不是强制它们自动转发。
答案 0 :(得分:26)
您可能需要查看$.ajaxError
。
$(document).ajaxError(function myErrorHandler(event, xhr, ajaxOptions, thrownError) {
alert("There was an ajax error!");
});
jQuery提供a whole bunch of other ways to attach global handlers。
要回答您的编辑,您可以使用$.ajaxSuccess
捕获成功的ajax请求,并且可以使用$.ajaxComplete
捕获所有(成功和失败)。您可以从xhr
参数获取响应代码,例如
$(document).ajaxComplete(function myErrorHandler(event, xhr, ajaxOptions, thrownError) {
alert("Ajax request completed with response code " + xhr.status);
});
答案 1 :(得分:1)
实际上,jQuery仅为此目的提供了钩子.ajaxError()
。当页面的ajax请求因错误而完成时,将调用与$ajaxError()
绑定的任何和所有处理程序。通过指定选择器,您可以在this
处理程序中引用.ajaxError()
。
要使用它来处理页面上的所有ajax请求错误并使用this
指向document
,您可以执行以下操作:
$(document).ajaxError(function(event, request, settings){
alert("Error requesting page: " + settings.url);
});
答案 2 :(得分:1)
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/
答案 3 :(得分:0)
我认为这是一个坏主意。我认为包装$.ajax
很好,但你在谈论重新定义它。任何没有意识到这一点的人都会得到意想不到的结果。
正如其他人所提到的,将处理程序绑定到$.ajaxError
是可行的方法。