Перехватить все вызовы AJAX?
Я пытаюсь перехватить все вызовы AJAX, чтобы проверить, содержит ли этот ответ AJAX определенный код ошибки, который я отправляю как JSON из моего скрипта PHP (коды: ACCESS_DENIED, SYSTEM_ERROR, NOT_FOUND).
Я знаю, что можно сделать что-то вроде этого:
$('.log').ajaxSuccess(function(e, xhr, settings) {
});
Но - это работает, только если событие "ajaxSuccess" всплывает до .log div? Я прав? Могу ли я достичь того, что хочу, привязав событие "ajaxSuccess" к документу?
$(document).ajaxSuccess(function(e, xhr, settings) {
});
Я могу сделать это либо в jQuery, либо в сыром JavaScript.
Ответы
Ответ 1
Из http://api.jquery.com/ajaxSuccess/:
Всякий раз, когда запрос Ajax завершается успешно, jQuery запускает событие ajaxSuccess. Любые и все обработчики, зарегистрированные в методе .ajaxSuccess(), выполняются в это время.
Таким образом, селектор не определяет позицию, в которой вы "ловите" событие (потому что, честно говоря, событие ajax по своей природе не начинается с элемента DOM), а скорее определяет область, в которой обработка по умолчанию (т.е. this
будет poitn к тому/тому элементу (элементам)).
В заключение - это должно быть именно то, что вы хотите для
Ответ 2
Если вы используете jQuery, $.ajaxSuccess
является хорошим вариантом, но здесь есть несколько более общий вариант, который будет перехватывать вызовы XHR из всех фреймворков (я тестировал его с помощью ExtJS и jQuery - он должен работать, даже если несколько рамки загружаются одновременно). Он был протестирован для работы с IE8, Chrome и Firefox.
(function(XHR) {
"use strict";
var open = XHR.prototype.open;
var send = XHR.prototype.send;
XHR.prototype.open = function(method, url, async, user, pass) {
this._url = url;
open.call(this, method, url, async, user, pass);
};
XHR.prototype.send = function(data) {
var self = this;
var oldOnReadyStateChange;
var url = this._url;
function onReadyStateChange() {
if(self.readyState == 4 /* complete */) {
/* This is where you can put code that you want to execute post-complete*/
/* URL is kept in this._url */
}
if(oldOnReadyStateChange) {
oldOnReadyStateChange();
}
}
/* Set xhr.noIntercept to true to disable the interceptor for a particular call */
if(!this.noIntercept) {
if(this.addEventListener) {
this.addEventListener("readystatechange", onReadyStateChange, false);
} else {
oldOnReadyStateChange = this.onreadystatechange;
this.onreadystatechange = onReadyStateChange;
}
}
send.call(this, data);
}
})(XMLHttpRequest);
Я разместил более конкретный пример github, который перехватывает вызовы AJAX и отправляет длительность вызовов AJAX обратно на сервер для статистического анализа.
Ответ 3
Необработанный код javacript для перехвата вызовов ajax:
(function(send) {
XMLHttpRequest.prototype.send = function(body) {
var info="send data\r\n"+body;
alert(info);
send.call(this, body);
};
})(XMLHttpRequest.prototype.send);
Код jQuery для перехвата ajax:
$.ajaxSetup({
beforeSend: function (xhr,settings) {
alert(settings.data);
alert(settings.url);
}
});
Ссылка: http://myprogrammingnotes.com/intercept-ajax-calls-jquery.html
Ответ 4
Попробуйте использовать Mockjax.js http://code.appendto.com/plugins/jquery-mockjax
Это позволяет вам захватывать вызовы AJAX на сервер и издеваться над этим местоположением.