Как я могу перехватить ответы ajax в jQuery перед обработчиком событий? - PullRequest
14 голосов
/ 31 августа 2011

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

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

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

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

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

ОБНОВЛЕНИЕ : Хорошо, вот что я получил, с помощью @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 в этом случае не поможет.

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

Ответы [ 3 ]

19 голосов
/ 05 января 2013

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

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

            return data;
        }
    });
6 голосов
/ 31 августа 2011

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

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

IДержу пари, что это работает и для .load ()

1 голос
/ 23 октября 2016

У Хуго Форте правильный ответ, единственный способ перехватить ответ Ajax перед вызовом любых обработчиков событий - это использовать dataFilter.

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

$.ajaxSetup({
    dataFilter: function (data, type) {
        if (data !== "" && data === "NOAUTH") {
            window.location = '/';
        }
        return data;
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...