ajax 全局错误,包装jquery的$.ajax()方法以定义全局错误处理

从这类问题的分支中,我希望包装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是一种可行的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值