Javascript 如何检查浏览器中是否打开了HTTP请求?

Javascript 如何检查浏览器中是否打开了HTTP请求?,javascript,ajax,xmlhttprequest,Javascript,Ajax,Xmlhttprequest,是否有一种简单的方法可以检测XMLHttpRequest是否在浏览器窗口中处于活动状态?或者有多少是活跃的?有没有办法检测我的浏览器窗口中是否有任何AJAX调用处于活动状态 问题的扩展:使用javascript是否有办法查看是否有任何XMLHttpRequests处于打开状态?比如“window.XMLisActive()”之类的 解决方案:最终为XMLHttpRequest:编写了一个包装器,您可以使用它 除非为XmlHttpRequest(或monkey-patch-it)编写一个跟踪打开的

是否有一种简单的方法可以检测
XMLHttpRequest
是否在浏览器窗口中处于活动状态?或者有多少是活跃的?有没有办法检测我的浏览器窗口中是否有任何AJAX调用处于活动状态

问题的扩展:使用javascript是否有办法查看是否有任何XMLHttpRequests处于打开状态?比如
“window.XMLisActive()”
之类的

解决方案:最终为
XMLHttpRequest

编写了一个包装器,您可以使用它


除非为
XmlHttpRequest
(或monkey-patch-it)编写一个跟踪打开的连接的包装器,否则无法检测来自JS的打开的连接

这是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);
    }
  })();
通过使用,您可以使用全局事件处理程序跟踪是否存在打开的请求:和


在ajaxStart上设置的全局变量和在ajaxComplete上重置的全局变量应该可以完成这项工作。

我尝试了@juan mendes的解决方案,但出现了一个错误:
错误代码:未定义的消息:未能在“XMLHttpRequest”上设置“responseType”属性:对于从文档发出的同步请求,无法更改响应类型。
在我的角度应用程序中。原因是
async
参数,默认情况下该参数应为true,但当缺少参数时,此修补程序将传递
undefined
,该参数转换为false。这个小改动的代码对我很有用:

(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);
        }
    })()

你说的积极是什么意思?你能把这个问题再扩展一点吗,比如你是如何做到这一点的,你尝试过什么等等?或者其他浏览器开发环境。这假设您使用的是jquery.ajax。如果没有jQuery库该怎么办?这就是我的答案所提到的,如果您有
XmlHttpRequest
的包装器,那么很容易做到(如果您的包装器支持的话)。如果你没有jQuery,你可以开始使用它,或者编写你自己的包装器。正确的配对是ajaxSend和ajaxComplete(检查文档)最后为它写了一个要点,可以在这里找到@kidcapital:我在这里发布了一些非常类似的东西,但没有花时间完成,所以我删除了它。你看了30秒了吗?它看起来几乎和我所拥有的一模一样;)在任何情况下,请确保测试网络错误,并且调用
abort()
,但我没有看到它。网络错误仍然会触发响应代码4?将此脚本注入浏览器进行selenium测试后,将再次检查abort()。我的应用程序停止工作。这是否会阻止我的应用程序调用。尝试使用每秒记录变量的
setInterval
调用注入此代码,它工作正常。因此,它不应该打乱任何应用程序。如果是这样,熟悉js调试的开发人员应该仔细检查它…:)我们将测试这种方法以实现测试自动化,以便能够知道目前是否没有打开ajax请求,或者通知是否所有请求都已完成。。。