26

从像这样的问题中分离出来,我希望包装 jQuery 的 $.ajax() 方法,以便我可以在一个位置提供错误处理,然后所有应用程序的远程调用都会自动使用它。

简单的方法是简单地创建一个新名称,类似于 $.get() 和 $.post() 如何实现 $.ajax() 的外观。但是,我希望重用名称 $.ajax(),这样我们就可以使用标准的 jQuery 语法来保留我们的其余代码,从而隐藏我们添加了自己的错误处理的事实。这是否实用和/或好实现,或者可能是一个可怕的想法?

编辑:到目前为止的响应表明 .ajaxError() 是要走的路。我知道这会捕获 400 和 500 级错误,但是有没有办法(使用此事件处理程序或其他方式)也可以捕获 302 重定向?我正在尝试处理重定向到登录页面的响应,但我们希望在它是 XHR 请求时拦截该重定向,允许用户取消操作而不是强制它们自动转发。

4

4 回答 4

34

你可能想看看$.ajaxError.

$(document).ajaxError(function myErrorHandler(event, xhr, ajaxOptions, thrownError) {
  alert("There was an ajax error!");
});

jQuery 提供了一大堆附加全局处理程序的其他方法

要回答您的编辑,您可以使用 捕获成功的 ajax 请求$.ajaxSuccess,并且可以使用 捕获所有(成功和失败)请求$.ajaxComplete。您可以从xhr参数中获取响应代码,例如

$(document).ajaxComplete(function myErrorHandler(event, xhr, ajaxOptions, thrownError) {
  alert("Ajax request completed with response code " + xhr.status);
});
于 2010-12-03T02:31:26.200 回答
2

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/

于 2017-06-09T13:50:12.607 回答
1

实际上,jQuery 提供了这个钩子,.ajaxError()就是为了这个目的。$ajaxError()当来自页面的 ajax 请求完成并出现错误时,将调用您绑定的所有处理程序。指定选择器允许您在处理程序this内部进行引用.ajaxError()

要使用它来处理页面上的所有 ajax 请求错误并使用this指向document,您可以执行以下操作:

$(document).ajaxError(function(event, request, settings){
   alert("Error requesting page: " + settings.url);
});
于 2010-12-03T02:32:55.300 回答
0

我认为这是个坏主意。我认为包装$.ajax很好,但您正在谈论重新定义它。任何没有意识到这一点的人都会得到意想不到的结果。

正如其他人所提到的,将处理程序绑定到$.ajaxError是要走的路。

于 2010-12-03T02:37:32.013 回答