Подтвердить что ты не робот

Перехватить все вызовы 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.

4b9b3361

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