gpt4 book ai didi

javascript - 网页的加载和执行顺序?

转载 作者:IT老高 更新时间:2023-10-28 11:03:27 25 4
gpt4 key购买 nike

我做过一些基于web的元素,但是我并没有过多考虑普通网页的加载和执行顺序。但现在我需要知道细节。很难从 Google 或 SO 中找到答案,所以我创建了这个问题。

一个示例页面是这样的:

<html>
<head>
<script src="jquery.js" type="text/javascript"></script>
<script src="abc.js" type="text/javascript">
</script>
<link rel="stylesheets" type="text/css" href="abc.css"></link>
<style>h2{font-wight:bold;}</style>
<script>
$(document).ready(function(){
$("#img").attr("src", "kkk.png");
});
</script>
</head>
<body>
<img id="img" src="abc.jpg" style="width:400px;height:300px;"/>
<script src="kkk.js" type="text/javascript"></script>
</body>
</html>

所以这是我的问题:

  1. 此页面如何加载?
  2. 加载顺序是什么?
  3. JS代码什么时候执行? (内联和外联)
  4. CSS 何时执行(应用)?
  5. $(document).ready 什么时候执行?
  6. 会下载 abc.jpg 吗?还是只下载 kkk.png?

我的理解如下:

  1. 浏览器首先加载 html (DOM)。
  2. 浏览器开始从上到下逐行加载外部资源。
  3. 如果 <script>满足了,会阻塞加载,等到JS文件加载执行完毕再继续。
  4. 其他资源(CSS/图像)并行加载并在需要时执行(如 CSS)。

还是这样的:

浏览器解析 html (DOM) 并以数组或类似堆栈的结构获取外部资源。 html加载完成后,浏览器开始并行加载结构中的外部资源并执行,直到所有资源都加载完毕。然后根据 JS 的不同,DOM 会根据用户的行为发生变化。

谁能详细解释一下当你得到一个 html 页面的响应时会发生什么?这在不同的浏览器中会有所不同吗?关于这个问题的任何引用?

谢谢。

编辑:

我用 Firebug 在 Firefox 中做了一个实验。它显示为下图: alt text

最佳答案

编辑:现在是 2022 年。如果您对有关网页加载和执行以及浏览器工作原理的详细报道感兴趣,您应该查看 https://browser.engineering/ (开源于 https://github.com/browserengineering/book)


根据您的样本,

<html>
<head>
<script src="jquery.js" type="text/javascript"></script>
<script src="abc.js" type="text/javascript">
</script>
<link rel="stylesheets" type="text/css" href="abc.css"></link>
<style>h2{font-wight:bold;}</style>
<script>
$(document).ready(function(){
$("#img").attr("src", "kkk.png");
});
</script>
</head>
<body>
<img id="img" src="abc.jpg" style="width:400px;height:300px;"/>
<script src="kkk.js" type="text/javascript"></script>
</body>
</html>

大概的执行流程如下:

  1. HTML 文档被下载
  2. 开始解析 HTML 文档
  3. HTML解析达到<script src="jquery.js" ...
  4. jquery.js被下载并解析
  5. HTML解析达到<script src="abc.js" ...
  6. abc.js被下载、解析并运行
  7. HTML解析达到<link href="abc.css" ...
  8. abc.css被下载并解析
  9. HTML解析达到<style>...</style>
  10. 解析和定义内部 CSS 规则
  11. HTML解析达到<script>...</script>
  12. 内部 Javascript 被解析并运行
  13. HTML解析达到<img src="abc.jpg" ...
  14. abc.jpg已下载并显示
  15. HTML解析达到<script src="kkk.js" ...
  16. kkk.js被下载、解析并运行
  17. HTML 文档解析结束

请注意,由于浏览器的行为,下载可能是异步且非阻塞的。例如,在 Firefox 中,此设置限制了每个域的同时请求数。

还取决于组件是否已经被缓存,在不久的将来请求中可能不会再次请求该组件。如果组件已被缓存,则组件将从缓存中加载,而不是从实际 URL 中加载。

当解析结束并且文档准备好并加载时,事件 onload被解雇。因此当onload被解雇,$("#img").attr("src","kkk.png");正在运行。所以:

  1. 文档已准备就绪,onload 已触发。
  2. Javascript 执行命中 $("#img").attr("src", "kkk.png");
  3. kkk.png已下载并加载到 #img

$(document).ready() event 实际上是当所有页面组件都加载并准备好时触发的事件。阅读更多信息:http://docs.jquery.com/Tutorials:Introducing_$(document).ready()

编辑 - 这部分详细说明并行或非并行部分:

默认情况下,根据我目前的理解,浏览器通常以 3 种方式运行每个页面:HTML 解析器、Javascript/DOM 和 CSS。

HTML 解析器负责解析和解释标记语言,因此必须能够调用其他 2 个组件。

例如当解析器遇到这一行时:

<a href="#" onclick="alert('test');return false;" style="font-weight:bold">a hypertext link</a>

解析器将进行 3 次调用,其中 2 次调用 Javascript,1 次调用 CSS。首先,解析器将创建该元素并将其注册到 DOM 命名空间中,以及与该元素相关的所有属性。其次,解析器将调用以将 onclick 事件绑定(bind)到此特定元素。最后,它将再次调用 CSS 线程以将 CSS 样式应用于此特定元素。

执行是自上而下和单线程的。 Javascript 可能看起来是多线程的,但事实是 Javascript 是单线程的。这就是为什么在加载外部 javascript 文件时,主 HTML 页面的解析被暂停的原因。

但是,CSS 文件可以同时下载,因为始终应用 CSS 规则 - 意思是说元素始终使用定义的最新 CSS 规则重新绘制 - 从而使其畅通无阻。

元素只有在被解析后才会在 DOM 中可用。因此,当使用特定元素时,脚本总是放置在窗口 onload 事件之后或之内。

这样的脚本会导致错误(在 jQuery 上):

<script type="text/javascript">/* <![CDATA[ */
alert($("#mydiv").html());
/* ]]> */</script>
<div id="mydiv">Hello World</div>

因为在解析脚本时,#mydiv元素仍未定义。相反,这会起作用:

<div id="mydiv">Hello World</div>
<script type="text/javascript">/* <![CDATA[ */
alert($("#mydiv").html());
/* ]]> */</script>

<script type="text/javascript">/* <![CDATA[ */
$(window).ready(function(){
alert($("#mydiv").html());
});
/* ]]> */</script>
<div id="mydiv">Hello World</div>

关于javascript - 网页的加载和执行顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1795438/

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