Javascript进度条不更新'在飞行',而是一次一次进程完成
Javascript progress bar not updating 'on the fly', but all-at-once once process finished?
我有一个循环,应该更新一个进度条作为循环但是,它只在循环实际完成后一次性给进度条上色。我记得有一个类似的问题,如果我使用警报语句,着色将工作,所以我认为它与线程的并发性有关。为了解决我的老问题,我使用了setTimeout。然而,这仍然不能让我的进度条实时着色。
我是这样做的:
for (var i = 0; i < numOfRows; i++) {
setTimeout('ColourBlock(' + i + ')', 0);
// do_work
}
function ColourBlock (position){
document.getElementById("block" + position).style.backgroundColor = "orange";
}
有人告诉我这可能是由于JavaScript优化?有人能帮忙吗?
这与线程无关。它是关于这样一个事实:当代码进行一系列快速的DOM或样式更改时,浏览器不会尝试在每次更改之间更新视图。相反,它会等待事情平静下来,然后重新绘制。
如果您按照您所描述的为每个更改编写一个非零超时值(例如100毫秒)的序列,那么您将看到它发生。正如你所写的,在零毫秒超时的情况下,所有的更新都将在很短的时间内发生——可能不到一毫秒,除非你有数千个这样的块。
(注意,您的示例代码不会为每次更改提供100作为超时;你必须把它们放到更远的未来,每增加100个。或者您可以使用间隔计时器,并在最后一次更新后取消它。
浏览器在执行javascript代码时不会更新UI。当代码完成并将控制权交还给UI时,更新将同时发生。
这也是为什么它与警报一起工作的原因——当警报弹出时,javascript执行被暂停,控制权被返回到UI。
您需要使用闭包,以便当您调用ColourBlock
时使用i
被调用时的值(在下面的代码中分配给currentPosition
)。尝试将for
循环更改为如下内容:
for (var i = 0; i < numofrows; i++) {
(function() {
var currentPosition = i;
setTimeout(function() {
ColourBlock(currentPosition);
}, 500);
})();
尝试增加setTimeout周期的时间。当我遇到类似的问题时,我们使用了200毫秒的间隔,它成功了。
相关文章:
- 如何使用Jquery一步一步地获取PHP数据
- 一种一次编辑具有不同值的表的多行的方法
- 如何设置相同的索引两次(一次在每个循环内,另一次在循环外部)
- 我想用管子把一口一口地灌入两股不同的溪流
- 如何使用child_process模块在Nodejs中实现一输入一输出
- 一步一步地从java调用javascript
- 通过单击按钮javascript显示两个图像中的一个(50次50次机会掷硬币)
- 链式转换不会一步一步触发
- Html5-javascript画布绘制一步一步
- 使用node.js一步一步创建自定义应用程序
- Javascript时间在特定的一天2次之间,然后写开
- Javascript没有遵循一步一步的指令
- 创建一步一步点击通过HTML5/Javascript图形的教育工具
- React和Axios触发两次(一次未定义,一次成功)
- 输出每一行被执行的javascript代码和/或一步一步地执行代码,无论在什么"进程",计时器等代码
- Angular JS一步一步的验证是行不通的
- Javascript-onchange函数只在html select中工作一次(第一次更改后)
- jQuery每次重复上一项两次
- Javascript进度条不更新'在飞行',而是一次一次进程完成
- 主干:是否有可能一次多次抓取?