我已经完成了一些基于Web的项目,但我对普通网页的加载和执行顺序没有太多考虑.但现在我需要了解细节.很难从Google或SO中找到答案,所以我创建了这个问题.
示例页面如下所示:
所以这是我的问题:
这个页面如何加载?
加载的顺序是什么?
什么时候执行JS代码?(内联和外部)
什么时候执行CSS(应用)?
$(文件).ready什么时候执行?
请下载abc.jpg吗?或者只是下载kkk.png?
我有以下理解:
浏览器首先加载html(DOM).
浏览器开始逐行从上到下加载外部资源.
如果满足a,则将阻止加载并等待加载并执行JS文件,然后继续.
其他资源(CSS /图像)并行加载并在需要时执行(如CSS).
或者是这样的:
浏览器解析html(DOM)并获取数组或类似堆栈结构的外部资源.加载html后,浏览器开始并行加载结构中的外部资源并执行,直到加载所有资源.然后,根据JS,DOM将根据用户的行为进行更改.
任何人都可以详细解释当你得到html页面的响应时会发生什么?这在不同的浏览器中有所不同?关于这个问题的任何参考?
谢谢.
编辑:
我用Firebug在Firefox上做了一个实验.它显示如下图:
根据你的样本,
大致的执行流程大致如下:
下载HTML文档
开始解析HTML文档
HTML解析到达
jquery.js
下载并解析
HTML解析到达
abc.js
下载,解析并运行
HTML解析到达
abc.css
下载并解析
HTML解析到达
解析和定义内部CSS规则
HTML解析到达
内部Javascript被解析并运行
HTML解析到达
abc.jpg
下载并显示
HTML解析到达
kkk.js
下载,解析并运行
HTML文档的解析结束
请注意,由于浏览器的行为,下载可能是异步和非阻塞的.例如,在Firefox中,此设置限制了每个域的同时请求数.
此外,根据组件是否已被缓存,可能不会在近期请求中再次请求该组件.如果组件已缓存,则将从缓存而不是实际URL加载组件.
解析结束并且文档已准备好并加载时,将onload
触发事件.因此,当onload
被解雇时,$("#img").attr("src","kkk.png");
运行.所以:
文档准备就绪,onload被触发.
Javascript执行命中 $("#img").attr("src", "kkk.png");
kkk.png
下载并加载到 #img
该$(document).ready()
事件实际上是当所有的页面组件被加载并准备触发事件.阅读更多相关信息:http://docs.jquery.com/Tutorials : Introducing_$(document).ready()
默认情况下,根据我目前的理解,浏览器通常以3种方式运行每个页面:HTML解析器,Javascript/DOM和CSS.
HTML解析器负责解析和解释标记语言,因此必须能够调用其他2个组件.
例如,当解析器遇到此行时:
a hypertext link
解析器将进行3次调用,两次调用Javascript,一次调用CSS.首先,解析器将创建此元素并将其注册到DOM命名空间中,以及与此元素相关的所有属性.其次,解析器将调用将onclick事件绑定到此特定元素.最后,它将再次调用CSS线程将CSS样式应用于此特定元素.
执行是自上而下和单线程.Javascript可能看起来是多线程的,但事实是Javascript是单线程的.这就是为什么在加载外部javascript文件时,主HTML页面的解析被暂停.
但是,CSS文件可以同时下载,因为CSS规则总是被应用 - 这意味着元素总是用最新的CSS规则重新绘制 - 从而使其解锁.
元素只有在解析后才能在DOM中使用.因此,在处理特定元素时,脚本始终位于窗口onload事件之后或之内.
像这样的脚本会导致错误(在jQuery上):
Hello World
因为解析脚本时,#mydiv
仍未定义元素.相反,这将工作:
Hello World
要么
Hello World