Как проверить, открыты ли HTTP-запросы в браузере?

Есть ли простой способ определить, активен ли XMLHttpRequest в окне браузера? Или сколько активных? т.е. Есть ли способ определить, активны ли какие-либо вызовы AJAX в окне моего браузера?

Расширение вопроса: Есть ли способ с помощью javascript увидеть, открыты ли какие-либо XMLHttpRequests? Например, "window.XMLisActive()" или что-то в этом роде?

Решение. В итоге написал обертку для XMLHttpRequest: суть здесь


person kidcapital    schedule 13.02.2012    source источник
comment
Что вы подразумеваете под активным? Можете ли вы немного расширить вопрос, например, как вы пытаетесь это сделать, что вы пробовали и т. д.?   -  person TheBoyan    schedule 14.02.2012


Ответы (4)


Невозможно обнаружить открытое соединение из JS, если вы не напишете оболочку для XmlHttpRequest (или не исправите ее), которая отслеживает открытые соединения.

Вот патч с обезьянами от kidcapital, не уверен, что он идеален, но это хорошее начало.

  (function() {
    var oldOpen = XMLHttpRequest.prototype.open;
    window.openHTTPs = 0;
    XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
      window.openHTTPs++;
      this.addEventListener("readystatechange", function() {
          if(this.readyState == 4) {
            window.openHTTPs--;
          }
        }, false);
      oldOpen.call(this, method, url, async, user, pass);
    }
  })();
person Juan Mendes    schedule 13.02.2012
comment
в итоге написал суть, которую можно найти здесь gist.github.com/1820380 - person kidcapital; 14.02.2012
comment
@kidcapital: Я разместил здесь что-то очень похожее, но не нашел времени, чтобы закончить его, поэтому удалил его. Вы смотрели на него в течение 30 секунд, что он был опубликован? Выглядит почти так же, как и у меня ;) В любом случае, обязательно проверьте наличие сетевых ошибок и abort() вызываемого - person Juan Mendes; 14.02.2012
comment
хаха я не видел. сетевые ошибки все равно вызовут responseCode 4? дважды проверит прерывание() - person kidcapital; 14.02.2012
comment
после внедрения этого скрипта в браузер для тестов селена мое приложение перестало работать. блокирует ли это вызовы моего приложения. - person Karthi; 28.07.2017
comment
Попытался внедрить этот код с вызовом setInterval, который регистрирует переменную каждую секунду, он работал без проблем. Так что это не должно испортить любое приложение. Если это так, разработчик, знакомый с отладкой js, должен перепроверить его... :) Мы будем тестировать этот подход для автоматизации тестирования, чтобы узнать, не открыт ли в данный момент ajax-запрос, или для уведомляя, если все запросы были завершены... - person Martin; 20.05.2019
comment
@Martin Обратите внимание, что это действительно старый вопрос, и вам, вероятно, также нужно обработать fetch() - person Juan Mendes; 20.05.2019
comment
@JuanMendes, это правильно, однако наше приложение использует версию Vaadin, которая на 100% полагается на запросы XHR, так что для варианта использования это нормально ... - person Martin; 20.05.2019

Для этого вы можете использовать FireBug.

введите здесь описание изображения

person Sarfraz    schedule 13.02.2012
comment
Или любую другую среду разработки браузера. stackoverflow.com/questions/4445759/ - person Juan Mendes; 14.02.2012

Используя jQuery, вы можете отслеживать наличие открытых запросов с помощью глобальных обработчиков событий: .ajaxStart() и .ajaxComplete()

Глобальная переменная, установленная в ajaxStart и сброшенная в ajaxComplete, должна выполнять эту работу.

person vdeantoni    schedule 13.02.2012
comment
Это предполагает, что вы используете jquery .ajax. Что делать, если у вас нет библиотеки jQuery? - person kidcapital; 14.02.2012
comment
Это то, о чем упоминал мой ответ, если у вас есть оболочка для XmlHttpRequest, это легко сделать (если ваша оболочка поддерживает это). Если у вас нет jQuery, вы можете либо начать использовать его, либо написать свою собственную оболочку. - person Juan Mendes; 14.02.2012
comment
Правильное сочетание — ajaxSend и ajaxComplete (проверьте документы) - person Rushabh Mehta; 27.07.2017

Я попробовал решение @juan-mendes и получил ошибку: ERROR Error Code: undefined Message: Failed to set the 'responseType' property on 'XMLHttpRequest': The response type cannot be changed for synchronous requests made from a document. в моем приложении Angular. Причиной является параметр async, который по умолчанию должен быть истинным, но когда аргумент отсутствует, этот патч передает undefined, что преобразуется в ложное. Код с этим небольшим изменением работает для меня:

(function() {
        var oldOpen = XMLHttpRequest.prototype.open;
        window.openHTTPs = 0;
        XMLHttpRequest.prototype.open = function(method, url, async = true, user = null, pass = null) {
            window.openHTTPs++;
            this.addEventListener("readystatechange", function() {
                if(this.readyState == 4) window.openHTTPs--;
            }, false);
            oldOpen.call(this, method, url, async, user, pass);
        }
    })()
person Marek Danel    schedule 17.08.2020