首页 > 代码库 > 浏览器加载渲染HTML、DOM、CSS、 javascript、image、flash、iframe、src属性等资源的顺序总结

浏览器加载渲染HTML、DOM、CSS、 javascript、image、flash、iframe、src属性等资源的顺序总结


页面响应加载的顺序:
 
1、域名解析->加载html->加载js和css->加载图片等其他信息
  DOM详细的步骤如下:
  1. 解析HTML结构。
  2. 加载外部脚本和样式表文件。
  3. 解析并执行脚本代码。
  4. 构造HTML DOM模型。
  5. 加载图片等外部文件。
  6. 页面加载完毕。
<html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    <title>Title</title>    <style type="text/css">        body        {            font-sie: 12px;        }    </style>    <link href="http://www.mamicode.com/style.css" rel="stylesheet" type="text/css" media="all" />    <script src="http://www.mamicode.com/js.js" type="text/javascript"></script></head><body>    <div>        <script type="text/javascript">            function f1() { }        </script>        <img src="http://www.mamicode.com/1.gif" />    </div>    <script type="text/javascript">        function f2() { }    </script></body></html>

上面代码的加载解析顺序为:?

 html → head → title → #text(网页标题) → style → 加载样式 → 解析样式 → link → 加载外部样式表文件 → 解析外部样式表 → script → 加载外部脚本文件 → 解析外部脚本文件 → 执行外部脚本→body → div → script → 加载脚本 → 解析脚本 → 执行脚本 → img → script → 加载脚本 → 解析脚本 → 执行脚本 → 加载外部图像文件 → 页面初始化完毕

 jquery的Dom Ready方法在加载图片等其他信息前就可以操作Dom了,先于window.onload事件触发前执行。 

2、<script>标签很方便,只要加入网页,浏览器就会读取并运行。但是,它存在两个严重的缺陷。 

  (i)严格的读取顺序(js各段代码的依赖性问题)

  (ii)性能问题

    浏览器采用"同步模式"加载<script>标签,也就是说,页面会"堵塞"(blocking),等待javascript文件加载完成,然后再运行后面的HTML代码。当存在多个<script>标签时,浏览器无法同时读取,必须读取完一个再去读取另一个,造成读取时间大大延长,页面响应缓慢。 为了解决这些问题,可以使用DOM方法,动态加载Javascript文件。代码如下:

   function loadScript(url){     var script = document.createElement("script");     script.type = "text/javascript";     script.src =http://www.mamicode.com/ url;     document.body.appendChild(script);   } 

这样做的原理是,浏览器即时创造出一个<script>标签,然后"异步"读取Javascript文件。这样不会造成页面堵塞,但会造成另外一个问题:这样加载的Javascript文件,不在原始的DOM结构之中,因此在DOM-ready(DOMContentLoaded)事件和window.onload事件中指定的回调函数对它无效。

3、 缩短页面load时间方法

例如,要加载三个外部js文件jquery.js 、world.js、hello.js可以使用下面的方法,相比于在head头部引入三个<script>或者在body里面最后引入大大缩短可load的时间

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="head">        <title></title>        <link href="http://www.mamicode.com/Styles/Site.css" rel="stylesheet" type="text/css" />     </head> <body>    <img src="http://www.mamicode.com/1.jpg" width="200" height="300" />     <script type="text/javascript">           function loadScript(url, callback) {                     var script = document.createElement("script");                    script.type = "text/javascript";                           //IE                    if (script.readyState) {                           script.onreadystatechange = function () {                                  if (script.readyState == "loaded" || script.readyState == "complete") {                                             script.onreadystatechange = null;                                            callback();                                        }                                }                         } else {                            //非IE                           script.onload = function () {                                   callback();                               }                       }                   script.src =http://www.mamicode.com/ url;                    document.getElementById("head").appendChild(script);                }           //第一步加载jquery类库            loadScript("jquery/jquery-1.4.1.js", function () {                  //第二步加载hello.js                    loadScript("js/hello.js", function () {                            //第三步加载world.js                           loadScript("js/world.js", function () {                                                });                         });                 });        </script> </body> </html> 

4、当执行引擎遇到”<script>“的时候,此时页面的下载和渲染都必须等待<script>执行完毕。

5、image、flash等资源加载顺序

  图片,flash的加载顺序和它们的出现顺序是一致的,即使在嵌套的Div里面加载的顺序也是他们出现的顺序

 6、背景图片的加载顺序

  浏览器会在把所有样式,包括外联的css文件都下载解析完成之后才开始渲染样式,而且会自动忽略会被覆盖的样式表。

  那么这给我们的一个重要启示是:在一个单纯由Html和Css组成的页面中,背景图片总是最后加载的,假若我们想要使用较小的背景图片作为占位符,用于在加载较大的图片或者Flash文件时给用户以提示,大部分时候恐怕是达不到效果的,因为背景图片有时甚至会在大图片或Flash文件加载完成之后才会被加载。当然,这里一个重要的先决条件就是“单纯由Html和Css组成的页面”,因为JavaScript会对页面元素的加载产生极大影响(见7)

7、JavaScript会对页面元素的加载产生极大影响

  参考:http://www.cnblogs.com/dkarthas/archive/2010/07/04/1770989.html

8、关于现代浏览器的三个注意点:

 

  • 定律一:资源是否下载依赖 JS 执行结果。
  • 定律二:JS 执行依赖 CSS 最新渲染。
  • 定律三:现代浏览器存在 prefetch 优化(并行下载)。

结论:head里出现外联js,无论如何放,css文件都不能和body里的请求并行

   head里的内联js只要在所有外联css前面,css文件可以和body里的请求并行

   head里的内联js只要在任一外联css后面,css文件就不能和body里的请求并行

 

浏览器加载渲染HTML、DOM、CSS、 javascript、image、flash、iframe、src属性等资源的顺序总结