Hot For Coding
网页实现资源加载Progress bar效果

Progress Bar

首先,目前几乎大多数网页上的Progress bar都是假的,在浏览器与服务器端交互过程中由于浏览器端的Ajax支持的特性受限没有办法知道已加载了多少内容,并且还有一种是Content-Length不声明的。所简单来说Progress bar不太能绘出实际网络情况,它跟Upload还不一样,Upload是已经知道文件的大小,它只要拿到服务器端返回的已上传大小数据就能绘制出Progress bar。

Angular的一个插件效果

full

我最近也在项目里加了一个Progress bar,代码不太美观,这里就不贴了,说一说这中间遇到一些需要思考的问题。

如何设计

分三段:

  • 0% - 30% 起步期间
  • 30% - 90% 等待响应期间
  • 90% - 100% 响应后,结束显示

发起一个Ajax请求后,Progress bar就会先走第一步,如果这期间服务器端没有响应,那么就会以1%-5%随机走第二步,如果这期间服务器没有响应就在90%地方静止不动,直到服务器端响应后在走完

如果有多个请求同时存在,这是最不好处理的地方了,一种处理是不允许同时存在多个请求?但可能体验不太好。既然不能避免同时存在多个请求,那么就要考虑如何处理同时发起多个Ajax请求之后,Progress bar如何处理。我的处理方法是把每一个Progress bar周期内的Ajax请求都加入队列,在这个队列都结束后才能让Progress bar结束,因为一个页面上就只有一个Progress bar,不能每一个Ajax请求都有对应的控制代码,否则就会出现回退,忽然多忽然少,闪烁的情况。

终止请求

请求是可以abort的,比如在发现一段时间后服务器还没有响应,而你的进度条却一直悬挂在页面顶部,这会用户会误以为你的页面正在工作而不敢做其它操作。所以对于每一个请求都要加入timeout机制,在超时终止请求后让Progress bar回退,就类似于我们在安装桌面软件时可能中途出错,于是安装进度条就会回退

TITLE: 网页实现资源加载Progress bar效果

LINK: https://www.qttc.net/467_webpage_progress_bar.html

NOTE: 转载内容请注明出处