gpt4 book ai didi

javascript - $(document). 什么时候准备好 DOM 树解析和渲染树?

转载 作者:太空宇宙 更新时间:2023-11-04 13:29:40 27 4
gpt4 key购买 nike

据我了解:

  • $(document).ready() 在整个 html 被解析
  • 时触发
  • 脚本(内联或外部)解析树阻塞

但令我惊讶的是,以下工作出乎意料地:

<html>
<head>
</head>
<body>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h1>This should show !</h1>
<script>
$(document).ready(function() {
// Intentional infinite loop
for(var i=0; i<100; i++) {
i--;
}
});
</script>
<h1>This should *not* show !</h1>
</body>
</html>

在执行上面的代码时,它会进入无限循环并出现空白屏幕。

在进入无限循环之前,预计会在屏幕上看到 This should show !

更新

  • 我创建了一个 jsfiddle http://jsfiddle.net/csgu8/ [ 无限循环可能会挂起你的标签页 ]
  • 这不是一个重复的问题

更新2

  • 请提供引用
  • AFAIK HTML 可以部分呈现,并且仅在此处未使用的 css 上呈现 block (评论?)

更新3

  • 换句话说,JS 在循环中被阻塞了,但是什么阻塞了部分 DOM(已解析)的呈现?
  • HTML 递增呈现,为什么不在这种情况下?

这是怎么回事??

最佳答案

如果您阅读 jQuery 文档以准备就绪,则应注意 In most cases, the script can be run as soon as the DOM hierarchy has been fully constructed. 我从中得出的结论行是,这并不一定意味着页面会显示。因此,即使您没有任何 css 代码,也不意味着您的文档会显示。

这里是一个 StackOverflow 问题的链接,该问题很好地解释了这一点:window.onload vs $(document).ready()

这是一个描述整个页面呈现过程的页面链接:http://friendlybit.com/css/rendering-a-web-page-step-by-step/

如果您注意到上面链接中的第 18 步,在加载所有 HTML 和 CSS 并执行 Javascript 之后,页面就会实际打印出来。以下 StackOverflow 问题包含进一步说明这一点的良好链接:Describe the page rendering process in a browser?

进一步说明(响应更新 3):

这是我对 friendlybit 文章的总结:

  1. 首先,您构建 HTML 代码本身。在这种情况下,它将是您的标题元素。
  2. 然后解析CSS。
  3. 然后,因为您调用了 document.ready(),Javascript 在里面执行。
  4. 在您的 Javascript 完成的情况下,您终于可以很好地设置所有内容,然后您可以继续实际呈现页面(另一种查看方式是“绘制”页面)。

这里是一个 JSFiddle,显示了它的工作原理(您需要打开控制台才能看到它的工作原理):http://jsfiddle.net/aLbmB/

JSFiddle 向您展示了两个 header 元素在执行 Javascript 之前被解析。如果将 for 循环中的代码更改为以下内容:

$("#header2").text($("#header2).text() + "----");
i--;

您会看到文本从未呈现,这很有可能表明 Javascript 正在执行,因此您永远不会真正进入页面呈现部分。另一个很好的例子是当您通过 jQuery 从数据库中提取数据并等待它全部加载时。数据集越大,页面加载所需的时间就越长(即使 HTML 代码已经存在)。

我从逻辑上考虑这个问题的方式是,在对它们执行任何 Javascript 之前,您首先要很好地设置所有值。然后你执行 Javascript,一旦一切都准备就绪,你就可以让你的用户查看你的成品。当然,当您不使用 document.ready() 时情况并非如此,但我想权衡速度与可预测性(在执行中)。

额外说明(由 lazertyuiopl 提供):

“您可以使用 alert() 触发已解析元素的绘制” 提出了一个很好的观点。如果这样做了,那么看起来好像每个元素都在一次绘制一个,从上到下。我建议检查这个 JSFiddle:http://jsfiddle.net/K9kG8/7/

加载后再次运行它,您将看到我相信 Yugal Jindle 期望的结果。

补充:我认为这个问题不是重复的,而是更多的问题可以通过另一个问题的答案来澄清。换句话说,一个具体的例子。

关于javascript - $(document). 什么时候准备好 DOM 树解析和渲染树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24751153/

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