Как перехватить ответы 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;
}
});