gpt4 book ai didi

javascript - DOMContentLoaded 阻止页面加载

转载 作者:搜寻专家 更新时间:2023-11-01 04:23:58 24 4
gpt4 key购买 nike

请看代码:

<!-- ... -->
<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>
<!-- ... -->

静态 html+css 足以呈现内容(尽管没有 IMG,但良好的布局 block 不依赖于 img 大小)。一般页面布局应立即显示,就像它一直打算的那样。并且只有在渲染(或至少开始绘制它)之后 Javsacript 才应该运行,无论它只是控制点击绑定(bind)还是无限循环,如此处示例所示。

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

(并且“就绪”事件在这里不适合,因为它不能保证在任何合理的时间触发)

  • 正如您从示例中看到的,我没有使用文档写入功能,也不打算使用。
  • 我还将脚本放在正文结束标记之前
  • 我没有在脚本标签中做任何实际工作 - 我订阅了该事件。

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

更新。 澄清

如果您将 DOMContentLoaded 用于常规看似无害的任务(订阅按钮事件、初始化其他代码的异步加载等),您实际上确实会延迟用户查看内容,而这正是 DOMContentLoaded 的真正问题。这里的循环阻塞在示例中是有意的,只是为了证明它确实阻塞了,对于那些错误地认为 DOMContentLoaded 是“异步”/“非阻塞”安全的东西(事实并非如此)的人。

最佳答案

有趣且出乎意料。我用 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);

关于javascript - DOMContentLoaded 阻止页面加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32656594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com