DOMContentLoaded 阻止页面加载

2024-02-20

请看代码:

<!-- ... -->
<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,但良好的布局块不依赖于 imgs 大小)。一般页面布局应该像预期的那样立即显示。 并且只有在渲染(或至少开始绘制它)之后,Javsacript 才应该运行,无论它只是控制单击绑定还是无限循环,如此处的示例。

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

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

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

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

UPD. 澄清

如果您使用 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DOMContentLoaded 阻止页面加载 的相关文章

随机推荐

  • 了解 git rev-list

    在寻找 git hook 示例时 我遇到了以下帖子 https github com Movidone git hooks blob master pre receive https github com Movidone git hook
  • Stackdriver 监控图表的算术运算

    我正在尝试为我的服务提供的自定义指标设置 Stackdriver 仪表板 特别是我从一般开始custom grpc time ms指标是一个量规并且有status上面有标签 我希望能够设置一个图表并针对指标的成功率发出警报 类似于count
  • Azure AppInsights - Http 结果代码故障

    我们已经在Azure中配置了API WebApp 然后连接了App Insights Log以获取失败时的详细信息 我们正在 APIM 上进行负载测试 有一次 我们开始收到 500 错误代码 这意味着应用程序级别存在问题 当我们查看详细信息
  • 何时使用 C++forward_list

    我对 C 有点陌生 正在阅读 C 编程语言 第 4 版 一书 在阅读 STL Containers 章节时 书中对forward list有介绍 forward list 单链表 基本上是一个优化的列表 对于空的和非常短的列表 空的forw
  • 优化整数系数列表与其长整数表示之间的转换

    我正在尝试优化我的多项式实现 特别是我正在处理系数模的多项式n 可能 gt 2 64 并对以下形式的多项式取模x r 1 r is lt 2 64 目前 我将系数表示为整数列表 并且我已经以最直接的方式实现了所有基本操作 我希望求幂和乘法尽
  • Chrome 扩展程序 MAX_WRITE 配额未补充

    我最近超出了 chrome 扩展中每小时允许的写入操作数 现在当我尝试使用 chrome storage 时收到此消息 Unchecked runtime lastError while running storage set This r
  • Spring Security JavaConfig:配置所需的通道(安全、不安全、任意)

    我试图通过任何渠道提供所有静态资源 css javascript 和图像 但无法让它与 anyRequest requiresInsecure Configuration EnableWebMvcSecurity PropertySourc
  • 通过滚动查找所有元素

    查找页面上所有具有滚动的元素的最可靠和最有效的方法是什么 目前 我正在考虑使用element all http angular github io protractor api view ElementArrayFinder with fi
  • 组合框在所选项目上绘制图像

    当选择该项目时 我尝试从组合框中的图像列表中绘制图像 我能够绘制图像 但是当onSelctedIndexChanged活动结束 我失去了我的形象 我的组合框已经有DrawMode OwnerDrawFixed 我有一个ListImage名为
  • 管理员权限被意外删除

    在尝试清除 Sonar 实例中不需要的用户 权限时 管理员的权限似乎已被撤回 我们再也看不到settings菜单项 通常出现在管理员登录链接旁边 无法再更改警报 我现在花了几个小时试图找出这些权限在数据库中的位置 并希望使用数据库中的一些插
  • 主干推送状态和错误 404

    我正在尝试实施 pushState true 但它仅适用于基本路线 不适用于其他继续给我错误 404 的路线 在 Chrome 中 如果我访问 http example app http example app OK 控制台消息显示 htt
  • 在 Elixir 中将映射转换为关键字列表

    我有一张以下形式的地图 browser name gt Chrome platform gt linux 我需要将其转换为关键字列表 browser name Chrome platform linux 实现这一目标的最佳方法是什么 这行不
  • 在这里疯了,不明白为什么 rename()、copy() 函数不起作用

    这是我所拥有的 name image jpeg to var www vhosts site com httpdocs termination files personal photos original name from var www
  • 按变量名迭代结构体

    更新 6个月后 我刚刚发现了这个答案 索引结构是否合法 Slava 的回答 https stackoverflow com a 40590471 2066079 我认为这是一个比这里提供的任何解决方案都要好得多的解决方案 因为绝对没有未定义
  • UIImagePickerController 在 iOS 9 上不请求权限

    我有一个 iOS 应用程序 我在其中展示了一个图像选择器 self picker UIImagePickerController alloc init self picker delegate self self picker source
  • 在 N 球面上生成均匀分布的随机点的算法

    我还没有在Python上找到这种算法的实现 像这样的事情 有两个输入参数 n 空间维度 m n 1 球面上的点数 我需要将它们大致均匀地排列在 n 球体的表面上 坐标轴位于n 1个球体的中心 例如 在 3d 中 可以在规则球体上定位点像这样
  • 如何使用关键原子逻辑安全地中断线程?

    我有一个线程在循环中执行两件事 等待 BlockingQueue 中的对象 然后处理它们 处理逻辑具有可在 JVM 外部观察到的效果 并且必须以原子方式完成 目前 该线程由一个易失性布尔变量控制 如中讨论的https stackoverfl
  • 生命游戏 - 覆盖当前一代而不是更新到下一代

    下面我添加了我的生命游戏代码 规则定义正确 并且运行顺利 然而 游戏并没有按预期进行 它不是更新到下一代 但它似乎正在覆盖当前一代 举个例子 三个水平点应该在下一代变成三个垂直点 但这并没有发生 解决方案 我有两代人 当代的和下一代的 它必
  • 我可以使用 PhoneGap 在 HTML 5 iPhone 应用程序中创建“呼叫”按钮吗?

    我可以使用 PhoneGap 在 HTML 5 iPhone 应用程序中创建 呼叫 按钮吗 按下此按钮应调用 iPhone 设备上的特定号码的呼叫 如果可以为按钮指定 URL 请使用 URL 格式tel phonenumber
  • DOMContentLoaded 阻止页面加载

    请看代码 p Firefox does not even shows blank page Tab is stuck in suggested sites for 5 seconds p p Chrome show just blank w