DOMContentLoaded阻止页面加载

5 javascript dom

请看代码:

<!-- ... -->
<head>
    <style type="text/css"> body { background: gray; } </style>
</head>
<body>
    <p>
        Firefox does not even shows blank page.
        Tab is stuck in "suggested sites" for 5 seconds.
    </p>
    <p>
        Chrome show just blank white. No text, no background. For 5 seconds.
    </p>
    <p>
        DOMContentLoaded event handler blocks page
        loading and rendering. Browser does not start
        rendering page until DOMContentLoaded
        handler function return.
    </p>

    <script>
        document.addEventListener('DOMContentLoaded', function() {
            var timestamp = Date.now() + 5000; while (Date.now() < timestamp);
            // or synchronous 5 seconds XHR as an equivalent of loop
        });
    </script>
</body>
<!-- ... -->
Run Code Online (Sandbox Code Playgroud)

静态html + css足以呈现内容(虽然没有IMG,但是好的布局块不依赖于imgs大小).一般页面布局应该像它一直想要的那样立即显示.并且只有在渲染(或者至少开始绘制它)之后,Javsacript才能运行,无论是否只是控制点击绑定或无限循环,如此处的示例.

在实际呈现静态页面布局或至少开始出现之后,如何运行JS?

(并且"就绪"事件不适合此处,因为不保证在任何合理的时间内开火)

  • 正如您从示例中看到的那样,我没有使用文档写入或计划.
  • 我还在正文结束标记之前放置脚本
  • 我没有在脚本标签中做任何实际的工作 - 我接受了这个事件.

为什么浏览器会阻止(阻止)用户查看静态定义的内容?至少现代浏览器可以阻止这种废话吗?

UPD.澄清

如果你使用DOMContentLoaded进行常规看似无害的任务(包括按钮事件,初始化其他代码的异步加载等),你实际上是在推迟用户查看内容,这是DOMContentLoaded的真正问题.这里的循环阻塞是故意的,只是为了证明它确实阻塞了,对于那些错误地认为DOMContentLoaded是"异步"/"非阻塞"安全的东西(不是).

www*_*rty 3

有趣且出乎意料。我用 requestAnimationFrame(callback) 解决了这个问题,如下所示:

function foo() {
    window.requestAnimationFrame(function() {
        window.requestAnimationFrame(function() {
            var timestamp = Date.now() + 5000; while (Date.now() < timestamp){};
            alert('now');
        });
    });
}
document.addEventListener('DOMContentLoaded', foo);
Run Code Online (Sandbox Code Playgroud)

  • 如果您实际上不需要与动画帧同步,请不要使用 rAF。使用 setTimeout 来满足一般的超时需求。 (2认同)