Перехватить все вызовы AJAX? - PullRequest
23 голосов
/ 30 июля 2011

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

Ответы [ 4 ]

59 голосов
/ 29 мая 2012

Если вы используете 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 обратно на сервер для статистического анализа.

7 голосов
/ 14 марта 2018

Необработанный код 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

7 голосов
/ 30 июля 2011

С http://api.jquery.com/ajaxSuccess/:

Всякий раз, когда запрос Ajax завершается успешно, jQuery запускает событие ajaxSuccess.Все обработчики, которые были зарегистрированы с помощью метода .ajaxSuccess (), выполняются в это время.

Таким образом, селектор не определяет позицию, в которой вы «ловите» событие (потому что,честно говоря, событие ajax по своей природе не начинается с элемента DOM), а скорее определяет область, в которой обработка будет по умолчанию (т. е. this будет указывать на этот / эти элементы).

В итоге - это должно быть именно то, что вы хотите

0 голосов
/ 31 июля 2011

Попробуйте использовать Mockjax.js http://code.appendto.com/plugins/jquery-mockjax

Позволяет перехватывать вызовы AJAX на сервере и проверять местоположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...