这是一个简化示例,以确保不涉及异步淡入/动画功能。
我想,当具有繁重工作负载的功能工作时背景为红色,并且当它准备就绪时变为黑色。实际发生的是,在功能准备好后,大多数时候背景会直接转为黑色。即使您正在等待“完成”被警告,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>
答案 0 :(得分:0)
“模态弹出窗口”用于保存脚本完全(永久)锁定浏览器和使用户真的不高兴。无法从JS代码中检测到此 guard ,并暂停遵循同步模型的JS执行。这是为了省你,编写不阻止的代码!通过使用thunk / closures或队列,实际上很容易将大多数计算设置为可恢复和可清除。
无论如何......根据我的经验,在FF3.5(Win)和IE6-8中,1ms的“延迟”足以更新CSS(实际延迟很可能超过1ms)。这迫使事件的“排队”发回到同步模型中的 ,至少在上面的情况下,允许在继续执行JS之前应用CSS样式。我认为Prototype.js使用0ms的值作为它的“延迟”函数,但我不是那么勇敢。
另外,'document.body': - )
(我很确定没有“更好”的方式,虽然整个方法闻起来像露天鱼市场。)