asp.net XMLHttpRequest 进度条以及lengthComputable always false的解决办法

一直用ajax好长时间了,对其原理也有一些了解,最近由于项目需要,使用ajax异步进度条的效果,就研究了一下,用原生的XMLHttpRequest实现进度条函数,XMLHttpRequest有以下函数可以使用,摘自(https://www.w3.org/TR/progress-events/)

type attribute valueDescriptionTimesWhen
loadstartProgress has begun.Once.First.
progressIn progress.Zero or more.After loadstart has been dispatched.
errorProgression failed.Zero or once.After the last progress has been dispatched, or after loadstart has been dispatched if progress has not been dispatched.
abortProgression is terminated.Zero or once.
loadProgression is successful.Zero or once.
loadendProgress has stopped.Once.After one of errorabort, or load has been dispatched.

进度条函数主要使用progress事件。下面构造一个进度条实现的demo

1、构建页面代码

 1 <div class="progress">
 2     <div id="pros" class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 0%;">
 3     </div>
 4 </div>
 5 <button id="trigger_ajax" type="button">请求数据</button>
 6 <script type="text/javascript">
 7     var trigger = document.getElementById("trigger_ajax");
 8     trigger.onclick = function () {
 9         var xhr = new XMLHttpRequest();
10         xhr.onprogress = function (event) {
11             console.log(event.lengthComputable);
12             console.log(event.loaded);
13             if (event.lengthComputable) {
14                 var loaded = parseInt(event.loaded / event.total * 100) + "%";
15                 $('#pros').width(loaded);
16                 $('#pros').text(loaded);
17             }
18         }
19         xhr.open("post", "/Home/aaa", true);
20         xhr.send(null);
21     }
22 </script>
进度条Html代码

2、后台处理接口

 1         [HttpPost]
 2         public void aaa()
 3         {            
 4             string result = string.Empty;
 5             for (int i = 1; i <= 6000; i++)
 6             {
 7                 result += i.ToString();
 8                 int len = result.Length;
 9                 Response.Headers.Add("Content-Length", len.ToString());
10                 Response.Headers.Add("Content-Encoding", "UTF-8");
11                 Response.Write(result);
12             }
13         }
后台数据处理接口

注意到 

Response.Headers.Add("Content-Length", len.ToString());
Response.Headers.Add("Content-Encoding", "UTF-8");

,写出 http 头时候,附加 “Content-Length”和Content-Encoding,这样 JS 端的 progress 事件的 event.lengthComputable 值才会为 true, event.total 才会在数据传输完毕之前取得值,否则 event.lengthComputable 值会返回 false, event.total 在数据完成之前值都是0

转载于:https://www.cnblogs.com/AlphaThink-AT003/p/5715408.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值