You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript获取当前页面正在进行的Ajax请求数?jQuery.active返回0异常

如何统计页面中正在进行的Ajax请求数量

首先,你提到的jQuery.active失效的问题,大概率是因为它只统计jQuery自身发起的Ajax请求——如果页面里有用原生XMLHttpRequest、fetch或者其他库(比如axios)发送的请求,jQuery.active是不会把这些算进去的。另外,也有可能是你的jQuery版本过低,或者请求已经完成了但你误以为还在进行中。

下面分两种场景给你解决方案:

场景1:只统计jQuery发起的请求

如果你的项目里所有Ajax都是用jQuery的$.ajax、$.get、$.post等方法发送的,那可以用下面两种方式:

方式1:确认jQuery.active的正确使用

先确保你没有在请求完成后才去读取jQuery.active。比如在请求发送后立刻打印:

// 发起一个请求
$.get('/api/data', function() {
  console.log('请求完成');
});

// 立刻打印当前活跃请求数
console.log(jQuery.active); // 这里应该返回1,而不是0

如果还是返回0,检查你的jQuery版本(建议用3.x以上版本),或者看看是不是请求被同步执行了(同步请求会阻塞,此时jQuery.active可能不会实时更新)。

方式2:自定义计数器(更可靠)

如果jQuery.active还是不好用,你可以利用jQuery的全局Ajax事件自己维护一个计数器:

let activeAjaxCount = 0;

// 请求开始时计数+1
$(document).ajaxSend(function() {
  activeAjaxCount++;
});

// 请求完成(成功/失败)时计数-1
$(document).ajaxComplete(function() {
  activeAjaxCount = Math.max(0, activeAjaxCount - 1); // 防止出现负数
});

// 随时获取当前活跃请求数
function getActiveAjaxCount() {
  return activeAjaxCount;
}

这样不管请求成功还是失败,计数器都会准确更新。

场景2:统计所有类型的Ajax请求(包括原生、fetch、axios等)

如果页面里混合了多种请求方式,那需要拦截所有可能的请求入口:

拦截原生XMLHttpRequest

let activeRequestCount = 0;

// 保存原生的open和send方法
const originalXHROpen = XMLHttpRequest.prototype.open;
const originalXHRSend = XMLHttpRequest.prototype.send;

XMLHttpRequest.prototype.open = function(method, url) {
  this._url = url;
  originalXHROpen.apply(this, arguments);
};

XMLHttpRequest.prototype.send = function() {
  activeRequestCount++;
  // 请求完成时(不管成功失败)计数-1
  this.addEventListener('loadend', function() {
    activeRequestCount = Math.max(0, activeRequestCount - 1);
  });
  originalXHRSend.apply(this, arguments);
};

拦截fetch请求

const originalFetch = window.fetch;

window.fetch = function(...args) {
  activeRequestCount++;
  return originalFetch.apply(this, args)
    .finally(() => {
      activeRequestCount = Math.max(0, activeRequestCount - 1);
    });
};

拦截axios请求

如果用了axios,可以用它的拦截器:

axios.interceptors.request.use(function(config) {
  activeRequestCount++;
  return config;
});

axios.interceptors.response.use(function(response) {
  activeRequestCount = Math.max(0, activeRequestCount - 1);
  return response;
}, function(error) {
  activeRequestCount = Math.max(0, activeRequestCount - 1);
  return Promise.reject(error);
});

最后,你可以写一个统一的方法来获取当前活跃请求数:

function getTotalActiveRequests() {
  return activeRequestCount;
}

这样不管是哪种方式发起的请求,都能被统计到啦!

内容的提问来源于stack exchange,提问作者samurai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:14:01