根据您的样本,
<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>
执行流程大致如下:
- HTML文档已下载
- HTML文档的解析开始
- HTML解析范围
<script src="jquery.js" ...
jquery.js
已下载并解析
- HTML解析范围
<script src="abc.js" ...
abc.js
已下载,解析并运行
- HTML解析范围
<link href="abc.css" ...
abc.css
已下载并解析
- HTML解析范围
<style>...</style>
- 内部CSS规则被解析和定义
- HTML解析范围
<script>...</script>
- 内部Javascript被解析并运行
- HTML解析范围
<img src="abc.jpg" ...
abc.jpg
已下载并显示
- HTML解析范围
<script src="kkk.js" ...
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解析器负责解析和解释标记语言,因此必须能够调用其他两个组件。
例如,当解析器遇到此行时:
<a href="#" onclick="alert('test');return false;" style="font-weight:bold">a hypertext link</a>
解析器将进行3次调用,其中两次调用Javascript,一次调用CSS。首先,解析器将创建此元素并将其与所有与此元素相关的属性一起注册到DOM名称空间中。其次,解析器将调用将onclick事件绑定到此特定元素。最后,它将再次调用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>