从进度条和alert的出现顺序来了解浏览器 UI 渲染 & JS进程
项目里有一个需求是在上传文件的时候需要显示进度条,那么理所当然的在上传完成后就需要提示用户上传完毕并且更新进度条。
之前的预期表现是,上传完毕后,先更新进度条到100%,再alert出提示,所以代码如下。
$('progressBar').text('100%');
$('progressBar bar').css('width', '100%');
alert('上传成功');
问题一:实际表现为先alert出提示,此时被阻塞的页面显示的进度条没有被更新到100%。
分析原因,浏览器UI渲染和JS执行共用同一个线程,在这段代码里,实际上第1、2行的代码的确已经被执行了,但是还有第3行的JS代码需要执行,也就是JS任务仍未完成,所以线程仍然被JS占用,导致已经被执行的UI修改需要等到JS任务结束后才能够使用线程刷新页面。而alert在没有被用户关闭之前JS任务会一直占用线程,导致alert弹出框后的进度条未被更新。
解决:通过setTimeout可以模拟出另外一个JS任务,简称这个新的JS任务为t2,原来的JS任务为t1。
它独立于当前的JS任务,所以在第3行运行完,将alert放在等待队列后,t1就让出线程,此时第2行修改了的UI渲染就先占用线程,完成UI的重新渲染,让出线程,再由t2占用线程执行alert。
$('progressBar').text('100%');
$('progressBar bar').css('width', '100%');
setTimeout(function() { alert('上传成功'); }, 100);
需要注意的是,如果实现进度条更新后马上弹出提示框,需要将setTimeout的等待时间调整到1000ms以内,一般来说10~100ms比较合适,时间差不要让用户感受到其中的间隔就可以了。
问题二:解决了一直留在上传页面alert和进度条的顺序问题,又发现上传过程中切换到其他标签页时,alert强制跳回上传页面的时候进度条仍然没有被更新。
目前估计问题处在标签页未被选中/激活的时候,线程的轮询暂停的原因。但是这时候JS的setTimeout仍然会运行,所以具体原因仍然需要确定……
TBC.
从进度条和alert的出现顺序来了解浏览器 UI 渲染 & JS进程的更多相关文章
- li进度条宽度和颜色按顺序显示的效果。
实际项目中li和里边的数值是动态生成的,需要控制它的宽度和颜色,效果如图: 如果能实现颜色按数值规律变化就好了,目前颜色是固定到数组中的. 实例代码如下: <!DOCTYPE html>& ...
- 使用Uploadify实现上传图片生成缩略图例子,实时显示进度条
不了解Uploadify的,先看看前一篇详细说明 http://www.cnblogs.com/XuebinDing/archive/2012/04/26/2470995.html Uploadify ...
- 如何在UIAlertView中显示进度条
今天这个问题是,在一个iPhone程序中,我要在后台做大量的数据处理,希望在界面上显示一个进度条(Progress Bar)使得用户了解处理进度.这个进度条应该是在一个模态的窗口中,使界 今天这个问题 ...
- 基于Jquery插件Uploadify实现实时显示进度条上传图片
网址:http://www.jb51.net/article/83811.htm 这篇文章主要介绍了基于Jquery插件Uploadify实现实时显示进度条上传图片的相关资料,感兴趣的小伙伴们 ...
- 30款基于 jQuery & CSS3 的加载动画和进度条插件
我们所生活每一天看到的新技术或新设计潮流的兴起,Web 开发正处在上升的时代.HTML5 & CSS3 技术的发展让 Web 端可以实现的功能越来越强大. 加载动画和进度条使网站更具吸引力.该 ...
- html5 canvas绘制环形进度条,环形渐变色仪表图
html5 canvas绘制环形进度条,环形渐变色仪表图 在绘制圆环前,我们需要知道canvas arc() 方 ...
- HTML5圆形百分比进度条插件circleChart
在页面中引入jquery和circleChart.min.js文件. <script src="path/to/jquery.min.js"></script&g ...
- Javascript 及 CSS3 实现进度条效果
Javascript 及 CSS3 实现进度条效果 一:css2 属性clip实现网页进度条: 在实现之前,我们先来介绍一下clip属性,因为这个属性在css2.1中很少使用到,所以我们有必要来了解 ...
- 超炫的HTML5粒子效果进度条 VS 如何规范而优雅地code
最近瞎逛的时候发现了一个超炫的粒子进度效果,有多炫呢?请擦亮眼镜! // _this.ch){ _this.particles.splice(i, 1); } }; this.Particle.p ...
随机推荐
- 阿里云服务器重启出现An error occurred 如何处理
最近网站重启阿里云服务后,出现 An error occurred, An error occurred. Sorry, the page you are looking for is current ...
- 手写spring事务框架, 揭秘AOP实现原理。
AOP面向切面编程:主要是通过切面类来提高代码的复用,降低业务代码的耦合性,从而提高开发效率.主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等. AOP实现原理:aop是通过cgli ...
- npm发布包
一.发布一个新包第一步:进入要发布的项目根目录,初始化为npm包: npm init 依次按提示填入包名.版本.描述.github地址.关键字.license等 这步完成之后会生成一个package. ...
- vue编写轮播图组件
<template> <div id="slider"> <div class="window" @mouseover=& ...
- 「BZOJ1669」D 饥饿的牛 [Usaco2006 Oct] Hungry Cows 牛客假日团队赛5 (LIS,离散化树状数组)
链接:https://ac.nowcoder.com/acm/contest/984/D 来源:牛客网 饥饿的牛 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...
- python 写matlab中的加性高斯白噪声AWGN
定义 原始信号:x 噪声信号:n 信噪比:SNR 信号长度:N def wgn(x, snr): snr = 10**(snr/10.0) xpower = np.sum(x**2)/len(x) n ...
- php 强制类型转换
123 123.01 array("123",123) true false null (string) "123" "123.01" ...
- Tengine + Lua + GraphicsMagick 实现图片自动裁剪/缩放
http://my.oschina.net/eduosi/blog/169606
- 使用layui iframe弹层,各弹层之前的传值问题
最近做一个后台管理系统,用到的layui,主要是使用它的弹层,但是各个弹层之前的传值经常容易搞晕,写个个博客记录一下,方便自己,也方便别人, 首先我的页面已经嵌套了好几个iframe页面了,嵌套了三个 ...
- 表格 td 设置宽度无效问题
现在有个需求,就是表格的列不固定,都是动态加载的,想给每一列设置宽度,但是设置 width:100xp,没有效果,不过设置min-width:100px 就有效果了,table的宽度为 td的宽度和 ...