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

时间:2012-02-13 20:21:32

标签: javascript ajax xmlhttprequest

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

问题的扩展:如果有任何XMLHttpRequests打开,我可以使用javascript的方法吗?例如" window.XMLisActive()"或类似的东西?

解决方案:结束编写XMLHttpRequest https://gist.github.com/1820380

的包装器

4 个答案:

答案 0 :(得分:28)

除非你为XmlHttpRequest(或猴子补丁)编写一个跟踪已打开连接的包装器,否则无法检测JS的开放连接。

这是小孩的猴子补丁,不确定它是否完美,但这是一个好的开始

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

答案 1 :(得分:3)

您可以使用FireBug

enter image description here

答案 2 :(得分:1)

使用jQuery,您可以跟踪全局事件处理程序是否存在打开请求:.ajaxStart().ajaxComplete()

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

答案 3 :(得分:0)

我尝试了@ 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参数,默认情况下该参数应为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);
        }
    })()