manlili blog

浏览器加载的顺序

页面响应加载的顺序:

1、域名解析->加载html->加载js和css->加载图片等其他信息
DOM详细的步骤如下:

  • 解析HTML结构。
  • 加载外部脚本和样式表文件。
  • 解析并执行脚本代码。
  • 构造HTML DOM模型。
  • 加载图片等外部文件。
  • 页面加载完毕。

举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<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="style.css" rel="stylesheet" type="text/css" media="all" />
<script src="js.js" type="text/javascript"></script>
</head>
<body>
<div>
<script type="text/javascript">
function f1() { }
</script>
<img src="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事件触发前执行。

需要注意的事情:

script标签很方便,只要加入网页,浏览器就会读取并运行。但是,它存在两个严重的缺陷。
(i)严格的读取顺序(js各段代码的依赖性问题)
(ii)性能问题
浏览器采用”同步模式”加载script标签,也就是说,页面会”堵塞”(blocking),等待javascript文件加载完成,然后再运行后面的HTML代码。当存在多个script标签时,浏览器无法同时读取,必须读取完一个再去读取另一个,造成读取时间大大延长,页面响应缓慢。 为了解决这些问题,可以使用DOM方法,动态加载Javascript文件。代码如下:

1
2
3
4
5
6
function loadScript(url){
 var script = document.createElement("script");
 script.type = "text/javascript";
 script.src = url;
 document.body.appendChild(script);
}

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

缩短页面load时间方法

页面减肥

页面的肥瘦是影响加载速度最重要的因素,删除不必要的空格、注释,将script和css移到外部文件,可以使用HTML Tidy来给HTML减肥,还可以使用一些压缩工具来给JavaScript减肥

减少文件数量

减少页面上引用的文件数量可以减少HTTP连接数,许多JavaScript、CSS文件可以合并最好合并

减少域名查询

DNS查询和解析域名也是消耗时间的,所以要减少对外部JavaScript、CSS、图片等资源的引用,不同域名的使用越少越好

缓存重用数据

使用缓存可以大大减少数据请求和渲染时间

优化页面素加载顺序

首先加载页面最初显示的内容和与之相关的JavaScript和CSS,然后加载DHTML相关的东西,像不是最初显示相关的图片、flash、视频等很肥的资源就最后加载

减少inline JavaScript的数量

浏览器parser会假设inline JavaScript会改变页面结构,所以使用inline JavaScript开销较大,不要使用document.write()这种输出内容的方法,使用现代W3C DOM方法来为现代浏览器处理页面内容

使用现代CSS和合法的标签

使用现代CSS来减少标签和图像,例如使用现代CSS+文字完全可以替代一些只有文字的图片,使用合法的标签避免浏览器解析HTML时做“error correction”等操作,还可以被HTML Tidy来给HTML减肥

Chunk your content

不要使用嵌套tables,而使用非嵌套tables或者divs,将基于大块嵌套的tables的layout分解成小tables,这样显示时不用加载整个页面(或大table)的内容

指定图像和tables的大小

如果浏览器可以立即决定图像或tables的大小,那么它就可以马上显示页面而不要重新做一些布局安排的工作,这不仅加快了页面的显示,也预防了页面完成加载后布局的一些不当的改变,image使用height和width,或者使用csssprite合并图片

请我喝杯果汁吧!