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

如何结合jQuery UI与Ajax实现数据透视表加载进度条

解决数据透视表加载进度条不动态更新的问题

你的问题出在两个核心点上:

1. 监听了错误的进度事件

你当前使用的xhr.upload.addEventListener("progress")是监听上传进度的(比如向服务器提交大文件场景),但你的需求是从服务器获取数据(下载场景),应该直接监听XMLHttpRequest对象的progress事件,而非upload子对象的事件。

2. 进度条缺少基础样式

你的#progressbar div没有设置基础CSS样式,即使宽度变化也无法直观显示,必须添加样式定义进度条的容器和填充效果。

修改后的完整代码

HTML(添加进度条样式)

<style>
#progress-container {
  width: 100%;
  height: 20px;
  border: 1px solid #ccc;
  border-radius: 4px;
  overflow: hidden;
  margin-bottom: 10px;
}
#progressbar {
  height: 100%;
  width: 0%;
  background-color: #4CAF50;
  text-align: center;
  line-height: 20px;
  color: white;
  transition: width 0.3s ease;
}
</style>

<div id="progress-container">
  <div id="progressbar"></div>
</div>
<table id="table"></table>

JavaScript(修正进度事件监听)

$.ajax({
  xhr: function() {
    var xhr = new window.XMLHttpRequest();
    var progressBar = $("#progressbar");
    
    // 监听下载进度(替换原upload进度事件)
    xhr.addEventListener("progress", function(evt) {
      if (evt.lengthComputable) {
        var percentComplete = Math.floor((evt.loaded / evt.total) * 100);
        console.log(percentComplete);
        progressBar.css("width", percentComplete + "%");
        progressBar.html(percentComplete + '%');
      }
    }, false);
    
    return xhr;
  },
  type: 'POST',
  url: url,
  dataType: 'json',
  data: { 'date1': date1, 'date2': date2 },
  success: function(data) {
    $("#table").empty();

    data.forEach(centro => {    
      var fila = "<tr>" +
        "<td>" + centro.prefijo + "</td>" +
        "<td>" + centro.sales + "</td>" +
        "<td>" + centro.possales + "</td>" +
        "<td>" + centro.totales + "</td>" +
        "<td>" + centro.percentage + "%" + "</td>" +
        "<td>" + centro.attendance + "</td>" +
        "<td>" + centro.factor + "%" + "</td>" +
        "</tr>";
      $("#table").append(fila);
    }); 
  },
  complete: function() {
    // 可选:加载完成后重置或隐藏进度条
    // $("#progressbar").css("width", "0%").html('');
  }
});

额外注意事项

  • 确保后端服务器返回Content-Length响应头,否则evt.lengthComputable会为false,无法计算准确的进度百分比。如果后端无法提前获取数据长度,可以改用模拟进度条(比如从0到100的平滑动画,直到请求完成)。
  • 如果返回的数据量极小,请求会瞬间完成,进度条可能直接跳到100%,这属于正常现象,可通过测试大数据量接口验证动态效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:25:46