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

JavaScript: обнаружение запросов AJAX

Есть ли способ обнаружить глобальные вызовы AJAX (особенно ответы) на веб-странице с помощью общего JavaScript (не с фреймворками)?

Я уже рассмотрел вопрос "JavaScript обнаружил событие AJAX", здесь, в StackOverflow, и попытался исправить в принятом ответе код в моем приложении, но он didn Не работай. Я никогда ничего не делал с AJAX до этого, я не знаю достаточно, чтобы изменить его для работы.

Мне не нужно ничего интересного, мне просто нужно обнаружить все (конкретное, на самом деле, но мне придется сначала обнаружить все и оттуда) ответы AJAX и исправить их в оператор IF для использования. Итак, в конце концов, мне бы хотелось что-то вроде:

if (ajax.response == "certainResponseType"){
    //Code
}

например.

Update: Кажется, я должен уточнить, что я не пытаюсь отправить запрос - я разрабатываю контент script, и мне нужно иметь возможность обнаруживать запросы AJAX на веб-странице (не создавать свои собственные), поэтому я могу выполнить функция при обнаружении ответа.

4b9b3361

Ответ 1

Это может быть немного сложно. Как насчет этого?

_send = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function() {

    /* Wrap onreadystaechange callback */
    var callback = this.onreadystatechange;
    this.onreadystatechange = function() {             
         if (this.readyState == 4) {

             /* We are in response; do something, like logging or anything you want */

         }

         callback.apply(this, arguments);
    }

    _send.apply(this, arguments);
}

Я не тестировал его, но он выглядит более или менее точным.

Обратите внимание, что это может не сработать, если вы используете фреймворки (например, jQuery), потому что они могут переопределить onreadystatechange после вызова send (я думаю, что jQuery делает). Или они могут переопределить метод send (но это маловероятно). Таким образом, это частичное решение.

Ответ 2

Вот некоторый код (проверенный путем вставки в консоль Chrome 31.0.1650.63) для поиска и регистрации или обработки других запросов ajax и их ответов:

(function() {
    var proxied = window.XMLHttpRequest.prototype.send;
    window.XMLHttpRequest.prototype.send = function() {
        console.log( arguments );
        //Here is where you can add any code to process the request. 
        //If you want to pass the Ajax request object, pass the 'pointer' below
        var pointer = this
        var intervalId = window.setInterval(function(){
                if(pointer.readyState != 4){
                        return;
                }
                console.log( pointer.responseText );
                //Here is where you can add any code to process the response.
                //If you want to pass the Ajax request object, pass the 'pointer' below
                clearInterval(intervalId);

        }, 1);//I found a delay of 1 to be sufficient, modify it as you need.
        return proxied.apply(this, [].slice.call(arguments));
    };


})();

Этот код решает вышеуказанный вопрос с принятым ответом:

Обратите внимание, что это может не сработать, если вы используете фреймворки (например, jQuery), потому что они могут переопределить onreadystatechange после вызова send (я думаю jQuery делает). Или они могут переопределить метод отправки (но это маловероятно). Таким образом, это частичное решение.

Поскольку он не полагается на обратный вызов onreadystatechange, который не изменяется, но контролирует сам "readyState".

Я адаптировал ответ отсюда: fooobar.com/questions/216730/...

Ответ 3

Дает эту попытку. Обнаруживает ответы Ajax, затем я добавил условие с использованием аргументов XMLHttpRequest readyState и состояния для запуска функции, если статус ответа = ОК

var oldXHR = window.XMLHttpRequest;

function newXHR() {
    var realXHR = new oldXHR();
    realXHR.addEventListener("readystatechange", function() {
        if(realXHR.readyState==4 && realXHR.status==200){
            afterAjaxComplete() //run your code here
        }
    }, false);
    return realXHR;
}
window.XMLHttpRequest = newXHR;

Изменено: Отслеживать все события JavaScript в консоли браузера