Javascript 如何在JS中强制重新绘制?
我正在努力实现的目标:Javascript 如何在JS中强制重新绘制?,javascript,html,repaint,Javascript,Html,Repaint,我正在努力实现的目标: 用户单击一个元素 屏幕显示“正在计算”屏幕 系统执行耗时的数学计算 屏幕显示结果(“完成”) 以下是代码: <div id ="di" onclick="calc()">initial</div> <script> function calc() { var n,a=0; document.getElementById('di').textContent="calculation in progress"; for(n=0;n<
<div id ="di" onclick="calc()">initial</div>
<script>
function calc()
{
var n,a=0;
document.getElementById('di').textContent="calculation in progress";
for(n=0;n<1000000000;n++) // Here's the time consuming calculation
{
a=a+n; // for clarity's sake, I removed a complicated math formula here
}
document.getElementById('di').textContent="done "+a;
}
</script>
首字母
函数计算()
{
var n,a=0;
document.getElementById('di').textContent=“正在进行计算”;
对于(n=0;n,您需要等待一毫秒或与工作人员一起进行计算
第一个示例可能是最简单的,与其直接调用calc
,不如创建一个新函数
function caller() {
// insert "calculation in progress" in the body
setTimeout(calc, 1);
}
然后调用调用者
您需要等待一毫秒或与工作者一起进行计算
第一个示例可能是最简单的,与其直接调用calc
,不如创建一个新函数
function caller() {
// insert "calculation in progress" in the body
setTimeout(calc, 1);
}
然后调用调用者IMO一种简单的处理方法是通过计时器函数在“小”块中执行计算,例如:
function calcFractal(x0, y0, x1, y1) {
... compute the fractal for the tile (x0, y0)-(x1, y1) ...
}
var x = 0, y = 0;
function nextTile() {
calcFractal(x, y, x+tw, y+th);
x += tw;
if (x >= width) {
x = 0;
y += th;
}
if (y < height) setTimeout(nextTile, 0);
}
nextTile();
函数计算分形(x0,y0,x1,y1){
…计算瓷砖(x0,y0)-(x1,y1)的分形。。。
}
变量x=0,y=0;
函数nextile(){
计算分形(x,y,x+tw,y+th);
x+=tw;
如果(x>=宽度){
x=0;
y+=th;
}
如果(y<高度)设置超时(nextile,0);
}
nextTile();
这允许您显示进度(例如,包括低分辨率的分形、计算百分比)和允许中断(例如,在停止按钮上单击onclick
事件)
如果平铺不是很小,那么开销是可以接受的,仍然可以保持页面对重新绘制和用户交互的合理响应。我认为一个简单的处理方法是通过计时器功能在“小”块中执行计算,例如:
function calcFractal(x0, y0, x1, y1) {
... compute the fractal for the tile (x0, y0)-(x1, y1) ...
}
var x = 0, y = 0;
function nextTile() {
calcFractal(x, y, x+tw, y+th);
x += tw;
if (x >= width) {
x = 0;
y += th;
}
if (y < height) setTimeout(nextTile, 0);
}
nextTile();
函数计算分形(x0,y0,x1,y1){
…计算瓷砖(x0,y0)-(x1,y1)的分形。。。
}
变量x=0,y=0;
函数nextile(){
计算分形(x,y,x+tw,y+th);
x+=tw;
如果(x>=宽度){
x=0;
y+=th;
}
如果(y<高度)设置超时(nextile,0);
}
nextTile();
这允许您显示进度(例如,包括低分辨率的分形、计算百分比)和允许中断(例如,在停止按钮上单击onclick
事件)
如果平铺不是很小,那么开销是可以接受的,仍然保持页面对重绘和用户交互的合理响应。因为现代浏览器可能会延迟重绘以获得更好的帧速率,因此具有
setTimeout
的版本可能无法在超时太低的情况下工作
如果可能的话,你需要使用。如果不可行,那么@Bálint answer应该可以工作,但超时要大得多(在我的Firefox测试中,它开始工作时的超时时间接近20-30)。实际超时值取决于浏览器(可能也取决于系统)
由于现代浏览器可能会延迟重画以获得更好的帧速率,因此具有
setTimeout
的版本可能无法在超时太低的情况下工作
如果可能的话,你需要使用。如果不可行,那么@Bálint answer应该可以工作,但超时要大得多(在我的Firefox测试中,它开始工作时的超时时间接近20-30)。实际超时值取决于浏览器(可能也取决于系统)
您还需要在
setTimeout
调用之前设置di div文本,以便它实际更新您的意思?它仍然不起作用:初始函数调用者(){setTimeout(calc,1);}函数calc(){var n,a=0;document.getElementById('di')。textContent=“calculation in progress”;for(n=0;n@Zack等同于above@Bálint-我确实读过它们,并粘贴了更新的代码。你能确认我是否做得正确吗?它的行为仍然与你的建议之前相同。@插入“正在进行计算”setTimeout之前调用方函数中的文本。您还需要在setTimeout
调用之前设置di div文本,以便它实际更新您的意思是什么?它仍然不起作用:初始函数调用方(){setTimeout(calc,1);}function calc(){var n,a=0;document.getElementById('di')。textContent=“计算中”;对于(n=0;n@Zack等同于above@Bálint-我确实阅读了它们,并粘贴了更新后的代码。您能确认我是否正确吗?它的行为仍然与您的建议之前相同。@在setTimeout之前,在调用方函数中插入“calculation in progress”文本。