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

Ajax文件上传进度条优化:仅在上传中或完成时显示

解决进度条始终可见的问题

你的核心问题在于进度条默认设置了display: block,导致页面加载后就一直显示着。我们只需要调整它的初始状态,再配合上传流程控制显示/隐藏逻辑就能搞定。

具体修改步骤:

1. 调整进度条的初始隐藏状态

先修改HTML里的进度条容器,把默认的display: block改成display: none,让它一开始就隐藏起来:

<div id="progress" style="display: none;width: 200px;padding: 1px 5px;margin: 1px 0;border: 1px inset #446;border-radius: 4px;">
  <div id="progressNumber" style="height:5px;background: lime;"></div>
  <div id="progressValue" style="text-align: center;"></div>
</div>

2. 上传开始时显示并重置进度条

在uploadFile函数里,发起请求前先把进度条显示出来,同时重置进度条的状态(避免残留上次上传的进度信息),还可以加个文件选择判断优化体验:

function uploadFile() {
  /* 启动XMLHttpRequest。选择文件后在此发起请求,监听事件并调用服务器端文件 */
  var fd = new FormData();
  var fileInput = document.getElementById('fileToUpload');
  
  // 先判断是否选择了文件
  if (!fileInput.files[0]) {
    alert("请先选择要上传的文件!");
    return;
  }
  
  fd.append("fileToUpload", fileInput.files[0]);
  
  // 重置进度条状态并显示
  var progressContainer = document.getElementById('progress');
  var progressBar = document.getElementById('progressNumber');
  var progressText = document.getElementById('progressValue');
  progressBar.style.width = '0%';
  progressText.innerHTML = '';
  progressContainer.style.display = 'block';

  var xhr = new XMLHttpRequest();
  xhr.upload.addEventListener("progress", uploadProgress, false);
  xhr.addEventListener("load", uploadComplete, false);
  xhr.addEventListener("error", uploadFailed, false);
  xhr.addEventListener("abort", uploadCanceled, false);
  xhr.open("POST", "files/import_vevo_xls.php");
  xhr.send(fd);
}

3. 可选:上传结束后控制进度条状态

如果你希望上传完成/失败/取消后,进度条保持显示(让用户看到最终状态),那不需要额外修改;如果希望上传结束后自动隐藏,可以在对应的回调函数里添加隐藏逻辑:

比如在uploadComplete中添加:

function uploadComplete(evt) {
  document.getElementById('progressNumber').style.width = '100%'; /* 图形显示 */
  document.getElementById('progressValue').innerHTML = '100%'; /* 数值显示 */
  alert(evt.target.responseText);
  // 可选:上传完成后隐藏进度条
  // document.getElementById('progress').style.display = 'none';
}

同样的,在uploadFailed和uploadCanceled里也可以添加相同的隐藏代码:

function uploadFailed(evt) {
  alert("错误,上传失败。");
  // 可选:失败后隐藏进度条
  // document.getElementById('progress').style.display = 'none';
}
function uploadCanceled(evt) {
  alert("上传已被浏览器中断。");
  // 可选:取消后隐藏进度条
  // document.getElementById('progress').style.display = 'none';
}

这样修改后,进度条就只会在上传进行中或完成时显示,完全符合你的需求啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:27:29