Как да проверя дали 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? ще провери двойно при abort() - 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 ibrary? - 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