JS网络请求加载进度条如何实现,代码实现步骤有哪些

通过监听XMLHttpRequest的progress事件或使用axios的onUploadProgress/onDownloadProgress,可以精确获取网络请求的实时进度,并渲染为可视化进度条。在实际开发中,无论上传大文件还是加载资源,进度条能有效缓解用户等待焦虑,同时提供可量化的反馈机制。

js网络请求进度条实现方法对比

为什么需要进度条

用户对无反馈的请求等待时间容忍度极低,据统计超过3秒就可能流失,进度条不仅告知“正在发生”,还给出剩余时间预期,直接提升交互完成度,在文件上传、数据导出、图片批量加载等场景下,进度条是刚需功能。

5分钟实现网页加载进度条 | NProgress快速上手
加载中
5分钟实现网页加载进度条 | NProgress快速上手

主流实现方案一览

目前前端实现进度条主要依赖三种底层方式,各有优劣。

  • 原生XMLHttpRequest:直接支持progress事件,兼容性最好,但需要手动处理进度计算和UI更新。
  • Axios:基于XHR封装,提供onUploadProgress和onDownloadProgress回调,使用简便,是大多数项目的首选。
  • Fetch API:本身不提供进度事件,需借助ReadableStream或第三方库实现,控制更底层但复杂度高。

下表对比关键特性:

方案 进度支持 易用性 兼容性
XMLHttpRequest 原生支持 中等 最佳(所有浏览器)
Axios 封装回调 高 较好(支持IE10+)
Fetch + ReadableStream 需手动实现 低 仅现代浏览器

基于XMLHttpRequest的进度条实践

监听progress事件:上传与下载

XMLHttpRequest对象提供了两个progress事件来源:`xhr.upload` 用于监听上传进度,`xhr` 本身用于监听下载进度,事件对象包含 `loaded`(已传输字节)和 `total`(总字节数),通过 `event.lengthComputable` 可以判断 `total` 是否有效。

const xhr = new XMLHttpRequest();
xhr.open('POST', '/upload');
// 上传进度
xhr.upload.onprogress = (e) => {
  if (e.lengthComputable) {
    const percent = Math.round((e.loaded / e.total)  100);
    // 更新进度条
  }
};
// 下载进度(响应数据)
xhr.onprogress = (e) => {
  // 同理
};
xhr.send(formData);

JS网络请求加载进度条如何实现,代码实现步骤有哪些

兼容性处理与注意事项

服务器必须返回 `Content-Length` 头部,否则 `total` 为0,无法计算百分比,对于压缩传输(如gzip),`total` 是压缩后的字节数,而 `loaded` 是解压后的接收量,会导致进度超过100%或不准,行业共识认为,在服务端关闭压缩或使用 `Transfer-Encoding: identity` 可获得更准确的进度,`xhr.upload.onprogress` 在部分浏览器中可能不触发,需做降级处理显示不确定进度动画。

代码封装与复用

你可以封装一个通用函数,传入回调,避免重复书写。

function requestWithProgress(url, options, onProgress) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open(options.method || 'GET', url);
    xhr.upload.onprogress = onProgress; // 上传
    xhr.onprogress = onProgress;        // 下载
    xhr.onload = () => resolve(xhr.response);
    xhr.onerror = () => reject(xhr.statusText);
    xhr.send(options.data);
  });
}

使用Axios简化进度条开发

axios上传进度条怎么用?详细步骤

Axios 在请求配置中直接提供 `onUploadProgress` 和 `onDownloadProgress` 回调,无需手动处理事件绑定。

步骤1: 安装axios(如未引入)
步骤2: 发起请求,配置回调函数

import axios from 'axios';
const formData = new FormData();
formData.append('file', fileInput.files[0]);
axios.post('/upload', formData, {
  onUploadProgress: (progressEvent) => {
    const percent = Math.round(
      (progressEvent.loaded  100) / progressEvent.total
    );
    // 更新进度条UI
    console.log(`上传进度:${percent}%`);
  },
  onDownloadProgress: (progressEvent) => {
    // 下载进度同理
  }
}).then(response => {
  // 处理结果
});

注意:onUploadProgress 仅在请求方法为 POST

JS网络请求加载进度条如何实现,代码实现步骤有哪些

、PUT、PATCH 等包含请求体时有效。onDownloadProgress 在获取响应数据时触发,适合下载文件或加载大JSON。

取消请求与错误处理

Axios 支持 `CancelToken` 或 `AbortController` 取消请求,取消后进度条应回退或重置。

const source = axios.CancelToken.source();
axios.post('/upload', data, {
  cancelToken: source.token,
  onUploadProgress: ...
});
source.cancel('操作取消'); // 触发catch

在 catch 中判断 axios.isCancel 来区分是取消还是网络错误,并更新进度条状态。

项目中的封装技巧

建议将进度回调抽取为公共方法,统一处理百分比计算和UI更新。

// utils/progress.js
export function updateProgress(loaded, total) {
  if (!total) return '加载中...';
  return `${Math.round((loaded / total)  100)}%`;
}
// 使用
onUploadProgress: (e) => {
  const text = updateProgress(e.loaded, e.total);
  progressBar.innerText = text;
}

Fetch API的进度监控替代方案

利用ReadableStream实现进度

Fetch 的 `response.body` 是一个 `ReadableStream`,可以读取数据块并累计大小,但需要知道总大小:服务器应在响应头中返回 `Content-Length`,由于 `ReadableStream` 读取的是解压后的数据,而 `Content-Length` 是压缩后的长度,两者可能不一致,导致进度不准,业内专家指出,在服务端禁用压缩或改用 `Content-Encoding: identity` 可以解决,但会牺牲传输效率。

const response = await fetch(url);
const contentLength = +response.headers.get('Content-Length');
const reader = response.body.getReader();
let receivedLength = 0;
while(true) {
  const { done, value } = await reader.read();
  if (done) break;
  receivedLength += value.length;
  const percent = contentLength ? Math.round((receivedLength / contentLength)  100) : 0;
  // 更新进度
}

第三方库推荐

社区有 `progress-fetch` 等库封装了此类逻辑,但使用场景有限,多数情况下,对于需要进度监控的请求,直接使用 Axios 或 XHR 更省力。

JS网络请求加载进度条如何实现,代码实现步骤有哪些

性能与兼容性权衡

Fetch 方案不兼容 IE,且需要处理 `ReadableStream` 的锁定和取消,如果你的项目只支持现代浏览器,并且需要流式处理(如实时解析),Fetch 是合适选择,否则,XHR 或 Axios 更稳妥。

大文件上传进度条场景优化

分片上传与进度合并

当文件超过几百MB,通常会采用分片上传,每个分片独立的进度事件需要合并为整体进度:整体进度 = (已成功上传的分片大小之和) / 文件总大小,在每片上传完成后,累加该片大小,并触发UI更新。

let uploadedBytes = 0;
const totalBytes = file.size;
chunks.forEach((chunk, index) => {
  uploadChunk(chunk).then(() => {
    uploadedBytes += chunk.size;
    const percent = Math.round((uploadedBytes / totalBytes)  100);
    // 更新进度条
  });
});

断点续传与进度恢复

将已上传的字节记录到 `localStorage` 或服务器,当页面刷新后重新读取,并跳过已上传部分,进度条初始化时根据已上传量计算初始百分比,避免重复上传。

js网络请求进度条常见问题

Q1: 为什么进度百分比突然跳到100%又回退?
A: 通常是服务器返回 `Content-Length` 与实际传输大小不符,或使用了压缩传输导致 `total` 错误,建议在服务端确认 `Content-Length` 正确,并关闭中间件(如代理)的压缩。

Q2: 上传进度条不更新是什么原因?
A: 检查 onUploadProgress 回调是否绑定正确,且请求体确实包含数据(如FormData),部分浏览器在上传小文件时可能不触发进度事件,因为文件太小瞬间完成,可考虑增加最小延迟动画。

Q3: 下载进度条能用于JSON数据吗?
A: 可以,但JSON通常很小,进度意义不大,对于大JSON(如大于10MB),下载进度能帮助用户感知完成时间,注意,如果服务器启用了gzip压缩,total 是压缩后大小,loaded 是解压后大小,会导致进度计算不准确,此时应使用 onDownloadProgress 并结合 Content-Length 原始值,或者直接显示“加载中”动画。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/538556.html

赞 (0)
h3cR4900G5服务器闪橙色灯怎么解决,是什么原因?
上一篇 2026年8月2日 02:58
如何用Python访问MySQL,pymysql怎么安装?
下一篇 2026年8月2日 03:05

相关推荐

  • 公司智能家居系统怎么选?全屋智能系统品牌排名

    2026年高性能架构与实战体验在智能家居行业飞速迭代的2026年,随着AIoT(人工智能物联网)设备的普及,家庭终端对数据处理、实时响应及数据安全的要求达到了前所未有的高度,对于企业级智能家居系统而言,服务器不仅是数据存储的中心,更是整个生态系统的“大脑”,本文基于真实部署环境,对市面上几款主流的高性能服务器进……

    2026年6月29日
    1300
  • 个人网站能不能发帖子?个人网站怎么发布文章

    个人网站能不能做帖子?深度解析服务器性能与SEO优化的黄金组合在构建个人博客或垂直领域内容站时,许多站长常陷入一个误区:认为“帖子”只是简单的文本发布,对服务器性能要求极低,随着百度算法对用户体验(Core Web Vitals)权重的提升,以及内容展示形式的日益丰富,服务器性能直接决定了帖子的加载速度、交互流……

    2026年7月4日
    13500
  • 刷卡开发票怎么操作?刷卡消费发票开具流程详解

    刷卡开发票是企业财务合规管理的关键环节,直接关系到税务风险控制和资金流水的合法性,核心结论是:企业必须建立标准化的刷卡开票流程,确保交易凭证与发票信息一致,同时利用数字化工具提升效率,避免因操作不当引发税务稽查风险,刷卡开发票的核心流程与合规要点交易凭证与发票信息的严格匹配刷卡交易完成后,企业需在24小时内生成……

    2026年4月1日
    11400
  • 云平台统计分析怎么做?云平台数据统计分析方案

    关于云平台的统计分析通用方案在数字化转型的深水区,服务器性能不再仅仅是跑分软件里的数字,而是直接关联到业务连续性、用户体验转化率以及最终的数据决策质量,对于追求高可用性与极致性能的企业级用户而言,选择一款能够支撑海量并发、提供精准实时监控的云服务器,是构建稳定数字基座的先决条件,本文基于真实的压力测试场景与长期……

    2026年6月7日
    3800
  • 服务器主机地址怎么查询?,怎么设置和修改?

    服务器主机地址就是服务器的网络门牌号,它决定了你的网站、应用或数据能否被用户稳定、快速地访问,无论你是部署网站、搭建游戏服务器还是管理远程办公系统,搞清楚主机地址的本质、查询方法和选择策略,是保障业务连续性的第一步,服务器主机地址的本质与构成服务器主机地址并不是一个单一的概念,它通常是IP地址和域名的组合体,各……

    2026年7月29日
    900
  • 江西电子签名认证证书怎么设置?如何办理

    在江西,想合法使用电子签名,核心是办一张带国家认可资质的电子签名认证证书(CA证书),并正确安装到电脑上,整个流程从申请到设置签名,跟着官方步骤走就能搞定,江西电子签名认证证书是什么?在哪用?电子签名认证证书就是一把数字版的公章,由江西CA(数字证书认证中心)签发,用来证明你或你单位的身份,它把签名人的身份信息……

    2026年7月30日
    1200
  • 索尼开发的游戏有哪些?索尼十大必玩经典游戏推荐

    索尼互动娱乐在全球游戏产业中始终占据着不可撼动的领军地位,其核心竞争力在于构建了一个以“叙事驱动”与“技术前沿”双轮驱动的第一方游戏生态系统,索尼开发的游戏之所以能够持续引领行业风向,根本原因在于其确立了“电影化叙事”的行业标杆,并通过硬件迭代不断拓展沉浸式体验的边界,最终形成了一套难以复制的高品质内容生产方法……

    2026年4月3日
    8600
  • 付费网盘里的付费实例有哪些,具体怎么收费

    付费网盘的核心价值在于数据安全与传输效率,选对付费实例能直接解决存储焦虑与协作瓶颈,个人用户怎么选付费网盘:百度网盘和阿里云盘哪个好用咱们平时存个电影、放点工作文档,免费网盘的限速和容量限制总是让人抓狂,周末刚拍完几十个G的婚礼视频,回家想传云端备份,结果免费通道的速度只有几十KB/s,这谁受得了,相当一部分用……

    2026年8月12日
    700
  • 14天能学会安卓开发吗?零基础安卓开发快速入门教程

    掌握移动世界的钥匙?这并非遥不可及,是的,在14天内,你可以系统性地入门安卓开发,构建出功能完整的基础应用,并打下坚实的进阶基础, 关键在于一个结构清晰、实践驱动的学习路径,本指南将为你拆解这14天的旅程,融合核心概念与动手实践,助你高效迈入安卓开发的大门,核心原则与准备在开始之前,明确几点:实践为王: 编码……

    2026年2月6日
    12800
  • 公司网络看不了视频怎么办?宽带卡顿解决办法

    公司的网络看不了视频在数字化办公日益普及的今天,视频已成为企业沟通、培训、营销及内容分发的核心载体,许多企业IT管理者常面临一个棘手问题:公司内网或宽带环境下,访问外部视频平台或内部视频服务器时,出现卡顿、缓冲、画质降级甚至完全无法加载的现象, 这不仅是员工体验的痛点,更直接影响工作效率与企业形象,本文将深入剖……

    2026年6月24日
    2000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注