0

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

我想要,当工作量大的功能工作时背景是红色的,当它准备好时变成黑色。实际发生的是,大多数时候背景会在函数准备好后直接变成黑色。哟不会看到红色背景,即使您正在等待“完成”被提醒。

有没有更好的解决方案,然后用 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>
4

1 回答 1

0

“模态弹出窗口”用于保存脚本,使其免于完全(永远)锁定浏览器并让用户非常沮丧。从 JS 代码中无法检测到此防护,并暂停遵循同步模型的 JS 执行。就是为了救你,写不阻塞的代码!通过使用 thunk/closures 或队列,将大多数计算设置为可恢复和可取消实际上是相当容易的。

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

另外,'document.body' :-)

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

于 2009-10-21T00:45:57.130 回答