Перехватить все вызовы AJAX?

Вопрос: Я пытаюсь перехватить все вызовы AJAX, чтобы проверить, содержит ли этот ответ AJAX определенный код ошибки, который я отправляю как JSON из моего скрипта PHP (коды: ACCESS_DENIED, SYSTEM_ERROR, NOT_FOUND). Я знаю, что можно сделать что-то вроде этого: $('.log').ajaxSuccess(function(e, xhr, settings) { }); Но - это работает, только если событие "ajaxSuccess" всплывает до .log div?

Вопрос:

Я пытаюсь перехватить все вызовы 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 на сервер и издеваться над этим местоположением.

Оцените статью
Добавить комментарий