setTimeout不能强制浏览器立即重新绘制
setTimeout can not force browser to repaint immediately
我想用setTimeout
逐个突出显示一些单词。它适用于Chrome和Firefox(在Firefox中,即使没有setTimeout, ajax也可以逐个突出显示)。但它在IE或Safari中不起作用,它们仍然在JS代码完成后显示所有高亮。JS代码为:
for(var k=0;k<MAX;k++) {
(function (_k) {
setTimeout( function() {
$.ajax({
//do something
success: function(data, textStatus, jqXHR) {
//using wrap <span> tag to highlight words according to ajax return data
}
}); } ,2000);
}) (k);
}
我只是想让浏览器重新绘制页面并立即显示高亮,问题是什么?非常感谢!
setTimeout()
和$.ajax()
都启动异步进程,然后立即继续到下一行。因此,您的for
循环将在任何超时运行之前完成,并且在任何ajax成功回调运行之前完成,并且所有超时都计划在循环结束后运行2000
毫秒,即或多或少在同一时间。
如果您希望每一个都在前一个之后两秒发生,那么在开始下一个之前等待前一个ajax请求完成,或者通过将延迟乘以循环计数器来增加每个后续超时的超时延迟:
for(var k=0;k<MAX;k++) {
(function (_k) {
setTimeout( function() {
$.ajax({
//do something
success: function(data, textStatus, jqXHR) {
//using wrap <span> tag to highlight words according to ajax return data
}
});
} , 2000 * k); // <--- this line is the only change
}) (k);
}
这样第一次超时是0毫秒,第二次是2000毫秒,第三次是4000毫秒,等等。
演示:http://jsfiddle.net/gsRL7/
你在做的是"拖延一切"。就像
// Say you have these values
var a = 1, b = 2, c = 3;
// The loop is technically doing
a+=1, b+=1, c+=1;
// And the end effect is the same. They're still in line.
a == 2;
b == 3;
c == 4;
你可能想在每个项目上都做setInterval
,这样每个标记就会彼此延迟。
var timer = setInterval(function(){
// do what you need to do here as if in the loop
if(k >= MAX) clearInterval(timer);
});
同样,你不能指望"立即"。看到这里有一个AJAX调用,如果网络阻塞,那么"立即"是不可能的。
在您的代码中,您跳过了会导致或中断重绘的确切行(或显示延迟重绘是实际问题还是我们正在查看更深层次的内容)。
像element.offsetWidth;
这样的显式几何访问通常有助于解决不必要的渲染优化,如果是这种情况的话。
相关文章:
- 使用新参数通过服务器端处理重新绘制引导数据表
- 在新窗口中打开时,未在画布中绘制图像
- 在新框架上绘制图像,同时仍然使用P5.js中的利萨茹曲线
- 将许多新图像绘制到画布时内存泄漏
- 有没有一种好方法可以添加新框并使用 javascript 重新绘制画布
- 谷歌地图多边形 - 添加新点后重新绘制
- 需要使用新数据重新绘制地图(与CartoDB.js结合使用)
- 使用单击功能绘制新的动态JS多边形
- HTML5 画布 - 使用剪辑擦除新圆圈后重新绘制新圆圈
- 使用数据表(Meteor Tabular)在新行中绘制数组的每个元素
- 将json中的数据合并到一个新的数组中,并使用d3.js绘制形状
- 如何加载新图像并将其绘制到画布上
- 使用阶梯将绘制的形状移动到新的Y
- 单击按钮打开一个新窗口,并用D3绘制多个大圆
- 谷歌地图v3方向渲染器重新绘制响应
- 删除以前的路线,并绘制一个新的路线
- 画布-只绘制时,悬停在新的瓷砖,而不是整个画布
- 如何将前一个函数的结果绘制到JavaScript中的新函数中
- 如何绘制画布到新的html页面
- 绘制新形状时删除DrawingManager形状