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

如何在document上全局监听Fetch事件?替代jQuery Ajax加载条逻辑

解决方案:给Fetch API添加全局加载条控制

这个问题我之前也碰到过!Fetch API确实不像jQuery的Ajax那样提供现成的全局事件钩子,不过我们可以通过两种实用的方式来实现你要的加载条逻辑:

方法1:封装自定义Fetch工具函数

最简单的思路是写一个封装函数,把加载条的显示/隐藏逻辑和请求流程绑定在一起,项目里所有请求都用这个封装后的函数发起:

const loading = document.getElementById('loading'); // 你的加载条元素

// 封装带加载条控制的Fetch函数
async function myFetch(url, options = {}) {
  // 请求发起前显示加载条
  loading.style.display = 'block';
  
  try {
    const response = await fetch(url, options);
    // 这里可以统一处理响应校验,比如判断response.ok
    if (!response.ok) {
      throw new Error(`请求失败:${response.status}`);
    }
    return response;
  } catch (error) {
    console.error('请求出错:', error);
    throw error; // 把错误抛出,让调用处可以自行处理
  } finally {
    // 不管成功/失败/取消,请求完成后都隐藏加载条
    loading.style.display = 'none';
  }
}

// 使用示例
myFetch('/api/get-data')
  .then(res => res.json())
  .then(data => console.log('获取到数据:', data))
  .catch(err => alert('加载失败,请重试'));

方法2:全局重写Fetch(猴子补丁)

如果不想修改项目里已有的Fetch调用,可以通过重写window.fetch来全局拦截所有请求,这种方式对现有代码的侵入性最低:

const loading = document.getElementById('loading');
// 先保存原生的Fetch方法,避免被覆盖后无法调用
const originalFetch = window.fetch;

// 重写全局Fetch
window.fetch = async function(url, options) {
  // 显示加载条
  loading.style.display = 'block';
  
  try {
    const response = await originalFetch(url, options);
    return response;
  } catch (error) {
    console.error('请求异常:', error);
    throw error;
  } finally {
    // 请求结束后隐藏加载条
    loading.style.display = 'none';
  }
};

// 现在项目里所有原生fetch调用都会自动触发加载条
fetch('/api/user-info')
  .then(res => res.json())
  .then(user => console.log('用户信息:', user));

额外优化建议

如果你的页面存在多个并发请求,建议加一个请求计数器:

  • 每次发起请求时计数器+1
  • 请求完成时计数器-1
  • 只有当计数器归0时才隐藏加载条
    这样能避免多个请求交替触发时,加载条频繁显示隐藏的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:21:32