Вопрос:
Я пытаюсь перехватить все вызовы 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.
Лучший ответ:
Из http://api.jquery.com/ajaxSuccess/:
Всякий раз, когда запрос Ajax завершается успешно, jQuery запускает событие ajaxSuccess. Любые и все обработчики, зарегистрированные в методе .ajaxSuccess(), выполняются в это время.
Таким образом, селектор не определяет позицию, в которой вы “ловите” событие (потому что, честно говоря, событие ajax по своей природе не начинается с элемента DOM), а скорее определяет область, в которой обработка по умолчанию (т.е. this будет poitn к тому/тому элементу (элементам)).
В заключение – это должно быть именно то, что вы хотите для
Ответ №1
Если вы используете 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 обратно на сервер для статистического анализа.
Ответ №2
Необработанный код javacript для перехвата вызовов ajax:
(function(send) { XMLHttpRequest.prototype.send = function(body) { var info=»send datarn»+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
Ответ №3
Попробуйте использовать Mockjax.js
Это позволяет вам захватывать вызовы AJAX на сервер и издеваться над этим местоположением.