在等待没有setTimeout()的繁重工作负载的函数之前,请等待模态覆盖?

时间:2009-10-20 14:37:16

标签: javascript dom overlay settimeout

这是一个简化示例,以确保不涉及异步淡入/动画功能。

我想,当具有繁重工作负载的功能工作时背景为红色,并且当它准备就绪时变为黑色。实际发生的是,在功能准备好后,大多数时候背景会直接转为黑色。即使您正在等待“完成”被警告,Yo也不会看到红色背景。

是否有更好的解决方案,然后使用setTimeout使用几毫秒,以便将背景更改为红色。调用work()会直接产生问题。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Test</title>
<script type='text/javascript'>
function work()
{
    var i, a;
    a = [];
    for(i = 0; i < 250000; i++)
    {
        a.push(Math.random());
    }
    a.sort();
    document.getElementsByTagName('body')[0].style.background = '#000000';
    alert('done');
    return true;
}

window.onload = function() {
    document.getElementsByTagName('body')[0].style.background = '#ff0000';
    //work();
    setTimeout(work, 100);

};
</script>
</head>
<body>
<h1>Test</h1>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

“模态弹出窗口”用于保存脚本完全(永久)锁定浏览器和使用户真的不高兴。无法从JS代码中检测到此 guard ,并暂停遵循同步模型的JS执行。这是为了省你,编写不阻止的代码!通过使用thunk / closures或队列,实际上很容易将大多数计算设置为可恢复和可清除。

无论如何......根据我的经验,在FF3.5(Win)和IE6-8中,1ms的“延迟”足以更新CSS(实际延迟很可能超过1ms)。这迫使事件的“排队”发回到同步模型中的 ,至少在上面的情况下,允许在继续执行JS之前应用CSS样式。我认为Prototype.js使用0ms的值作为它的“延迟”函数,但我不是那么勇敢。

另外,'document.body': - )

(我很确定没有“更好”的方式,虽然整个方法闻起来像露天鱼市场。)