Как перехватить ответы ajax в jQuery перед обработчиком события?

Я хотел бы зарегистрировать глобальный обработчик событий для всех запросов AJAX, чтобы я мог перехватывать и обрабатывать ответы с сервера до того, как их обработает обработчик конкретных событий.

Например, мой код может иметь что-то вроде:

$("#placeholder").load("/fragments/userpics");

И я хотел бы зарегистрировать обработчик событий "before", чтобы я мог, например, отобразить окно входа, если возвращается ответ 401, или, возможно, повторить попытку, если есть ответ 503.

Я думал, что $.ajaxError() - это то, где я бы сделал что-то подобное, но, по-видимому, это вызвано только после обработчиком событий.

UPDATE: ОК, вот что я получил до сих пор, с помощью @genesis:

$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
    var success = options.success;
    options.success = function(data, textStatus, jqXHR) {
        // override success handling
        if(typeof(success) === "function") return success(data, textStatus, jqXHR);
    };
    var error = options.error;
    options.error = function(jqXHR, textStatus, errorThrown) {
        // override error handling
        if(typeof(error) === "function") return error(jqXHR, textStatus, errorThrown);
    };
});

После некоторого тестирования, похоже, мне также нужно будет переопределить options.complete.

Однако это все еще не охватывает все базы, поскольку вы также можете присоединить события непосредственно к объекту jqXHR, а изменение options в этом случае не поможет.

Любые советы?

Ответы

Ответ 1

Если вы хотите обрабатывать данные, возвращаемые с сервера перед обработчиком событий, используйте datafilter:

    jQuery.ajaxSetup({
        dataFilter: function (data, type) {
            //modify the data

            return data;
        }
    });

Ответ 2

Обработайте пользовательские параметры Ajax или измените существующие параметры перед отправкой каждого запроса и до того, как они будут обработаны с помощью $.ajax().

http://api.jquery.com/jQuery.ajaxPrefilter/

Я уверен, что это работает и для .load(), тоже

Ответ 3

У Hugo Forte есть правильный ответ, единственный способ перехватить ответ Ajax перед вызовом обработчиков событий - использовать dataFilter.

Мне пришлось использовать это сегодня, чтобы обрабатывать перенаправление ответов ajax на стороне клиента, не переустанавливая код слишком много.

$.ajaxSetup({
    dataFilter: function (data, type) {
        if (data !== "" && data === "NOAUTH") {
            window.location = '/';
        }
        return data;
    }
});