Window.onload block DOM render, setTimeout not



我已经在chrome和safari中测试过了,两者都有相同的结果。

当我尝试在窗口onload事件之后运行循环时,它会一直等待循环结束,然后在其上面呈现常规DOM

但是,如果我通过setTimeout调用循环代码,即使它是0毫秒,它也会加载DOM,然后运行循环。

默认情况下,窗口加载事件不应该这样做吗?我想了解如何才能真正让javascript代码在DOM呈现后运行。

谢谢。

<!DOCTYPE html>
<html lang="en">
<body>
<div id="root">
foo
</div>
<script>
window.onload = ( () => {
// b()
setTimeout(() => {
b()
}, 0);
});
function b() {
let i = 0
while (i < 400000000) {
i++
}
document.getElementById('root').innerHTML = i
}
</script>
</body>
</html>

但是,如果我们注释掉setTimeout中的b((并取消注释它上面的b(。

谢谢。

在加载完所有资源后,onload事件会触发。这里没有外部资源可以加载,所以它会在下一个画框之前立即启动。

超时可能会让浏览器更新渲染,但这不是既定的,下一次绘制可能会在超时后进行。

如果您想确保页面在执行脚本之前至少绘制过一次,那么通过调用requestAnimationFrame()等待下一个绘制帧,并在回调中等待下一任务(例如使用setTimeout(fn, 0)(:

requestAnimationFrame(() => setTimeout(yourScript, 0));

最新更新