BearRui(AK-47)
花开有时,错过了一日便错过了一季,就象人生错过了相遇,就不再找寻到美丽的相聚
随笔- 39  文章- 2  评论- 1288 
博客园  首页  新随笔  联系  管理  订阅 订阅
记一复杂页面的前端优化(1) - 不一样的延迟加载

  刚刚做完1个复杂页面的前端性能优化,这里的优化是针对这个页面具体的需求单独做的优化,所以这里不会谈那些减少http请求,合并压缩js,css,图片合并等等。因为这些是所有页面都需要做的,如果需要了解这些,可以参考我这篇文章:web高性能开发系列随笔

 

页面介绍:

  该页面是1个记账类的页面,页面如下:

 

  页面主要有4部分组成:

1. 上部的输入部分(有5大不同的类型,每个类型都是1个单独的tab,对应内容也不一样)  

2. 左边的分类列表(默认显示一级分类,点击展开子类)

3. 右边时间选择区(按月,年,季,自定义时间过滤等等)

4. 右边下半部分的数据列表(默认只显示每条数据基本信息,点击展开详细信息) 

 

  可能看到这里大家不觉的这个页面会很大,那就再细说下,该页面包含记账的所有的功能(添加、删除,修改,分拆,上传图片,显示数据,数据排序),而且每种下拉列表前面都有个"加号"(见输入部分的下列列表),点击"加号"都会弹出类似如下的窗口进行添加(总共有8个左右的弹出窗口),所有的这些都是通过js来实现(js代码总共写了大概2000行,不含注释):

  

 

 

问题

  该页面有一些用户反映比较慢,经过测试也发现,因为页面比较复杂,js也比较多,所以在IE下速度会比较慢(特别是IE6),而chrome和firefox速度还是可以的,所以这次的优化主要针对IE,当然优化后的其他浏览器肯定也会受益。

 

优化1:弹出窗口的延迟加载

  本来第1个优化不应该写这个,因为这个优化效果并不是最明显的。把它放在第一位,是因为个人觉得这种延迟加载的想法还不错,比较有新意(目前还没见过网上有人介绍过这种延迟加载)。

 

  入正题,上面说到,该页面总共有8个弹出窗口,而且每个弹出窗口的都使用了不同的图片(不少是png),监控发现这些弹出窗口用的png图片虽然设置了缓存头(也使用了document.execCommand("BackgroundImageCache", false, true);),但是在IE6下每次都不直接使用缓存,而是发生1个请求,并得到304状态回应(原因我估计跟使用DD_belatedPNG来处理png图片有关,因为时间关系还没深入研究),监控图如下:

  

  从图中可以看出这几个图片很影响加载速度,其实一开始我们根本用不上这些弹出窗口的图片,因为默认都是隐藏的,而且这些弹出窗口,一般用户都用的比较少。理所当然,我们想到了延迟加载。

 

  想到延迟加载,第一想到就是先不加载弹出窗口的html代码,这样就不会加载对应的图片了,当用户点击弹出按钮的时候,再去后台加载对应的html代码。但这样就有个问题,当用户点击"加号"按钮,用ajax去加载html代码,用户明显就会感觉到半天窗口还没弹出来,就会连续的点击,这种用户体验肯定是失败的。

 

  我们想要的延迟加载是先加载html代码,但不加载html代码使用的图片。但用户点击"加号"的时候,直接弹出窗口并加载图片,这样用户一点击就可以看到窗口。那如何实现这种功能了,于是我想到了html的注释。我们先把所有弹出窗口的html代码放进注释中(这样就不会加载图片),当用户点击"加号"时,用js读取注释中的html插入到body中(不需要ajax),然后弹出窗口。

 

  比如有2个弹出窗口,代码大概如下(并不是完整代码,不能直接运行):

 

	 <script>
	 	 var loaded = new Object();  // 记录哪些html已经append到body中
	 	/**
		 * 加载html,该html已经以注释的方式嵌入的html中,eg:
		 * <div id="fast_model_lazy">
		 *	<!--[lazy]>
		 *	sass
		 *  <![endlazy]-->
		 * </div>
		 */	
		function loadHtml(id){
			// 已经加载过,不再加载
			if(loaded[id])
				return false;
			
			var html = $.trim(document.getElementById(id).innerHTML);
			// 去掉注释开头(11位)和结尾(14位)
			html = html.substring(11,html.length-14);
			$(document.body).append($(html));
			
			loaded[id]=1;
			return true;
		}
		function click1(){
			loadHtml("fast_model_lazy");
			// 弹出窗口
			$("#fast_model_lazy").showDialog();
		}
		function click2(){
			loadHtml("fast_model2_lazy");
			// 弹出窗口
			$("#fast_model2_lazy").showDialog();
		}
	 </script>
	 <button click="click1()">弹出第一窗口</button>
	 <button click="click2()">弹出第二窗口</button>
	 
	 <div id="fast_model_lazy">
	   <!--[lazy]>
	   <div id="fast_model" class="model">
	   		....这里省略html
	   </div>
	  <![endlazy]-->
	 </div>
	
	 <div id="fast_model2_lazy">
	   <!--[lazy]>
	   <div id="fast_model2" class="model">
	   		....这里省略html
	   </div>
	  <![endlazy]-->
	 </div>

 

总结:

这种延迟加载的方式,主要用于延迟图片的加载,css的应用,js的解析和执行等等,并不是为了延迟加载html。如果是大量的html代码,比如分页的数据,

使用这种方式就不太合适。个人觉的这种加载方式还可以在很多地方用的到的。

 

后语:

今天就写这些,下次再写写对该页面的其他的一些优化。

[作者]:BearRui(AK-47)
[博客]: http://www.cnblogs.com/BearsTaR/
[声明]:本博所有文章版权归作者所有(除特殊说明以外),转载请注明出处.
绿色通道:好文要顶关注我收藏该文与我联系
posted on 2010-07-14 08:32 BearRui(AK-47) 阅读(3632) 评论(35) 编辑 收藏
发表评论
1875567
 回复 引用 查看   
#1楼 2010-07-14 08:38 | David Dai      
这不是金蝶的记账页面么
 回复 引用 查看   
#2楼[楼主] 2010-07-14 08:42 | BearRui(AK-47)      
@David Dai
呵呵,^_^

 回复 引用 查看   
#3楼 2010-07-14 09:19 | Tony Zhou      
这个和jquery的lazyload差不多么?就是那种往下拉页面再加载图片的。
 回复 引用 查看   
#4楼[楼主] 2010-07-14 09:24 | BearRui(AK-47)      
@Tony Zhou
jquery的lazyload 没用过,不过我猜jquery 只是加载单独的几个图片,如果图片一多,而且很多是背景图片,使用jquery的lazyload就会很麻烦,而且万一HTML结构变了,图片也变了,还得改js来告诉jquery需要加载哪些图片。

 回复 引用 查看   
#5楼 2010-07-14 09:28 | Tony Zhou      
引用BearRui(AK-47):
@Tony Zhou
jquery的lazyload 没用过,不过我猜jquery 只是加载单独的几个图片,如果图片一多,而且很多是背景图片,使用jquery的lazyload就会很麻烦,而且万一HTML结构变了,图片也变了,还得改js来告诉jquery需要加载哪些图片。

嘿嘿,不用的,在文件顶端加入几句话就可以,不用指明文件名的。

 回复 引用 查看   
#6楼[楼主] 2010-07-14 09:36 | BearRui(AK-47)      
@Tony Zhou
刚看了下lazyload ,lazyload 好像只能延迟加载<img 标签中的图片吧,不能延迟加载css中background设置的背景图片吧?

 回复 引用 查看   
#7楼 2010-07-14 09:41 | Tony Zhou      
引用BearRui(AK-47):
@Tony Zhou
刚看了下lazyload ,lazyload 好像只能延迟加载<img 标签中的图片吧,不能延迟加载css中background设置的背景图片吧?

是滴~

 回复 引用 查看   
#8楼 2010-07-14 09:45 | zwei      
页面看着挺不错
 回复 引用 查看   
#9楼[楼主] 2010-07-14 09:47 | BearRui(AK-47)      
@Tony Zhou
恩,我这种方法可以延迟加载所有使用的图片,但没有lazyload使用灵活

 回复 引用 查看   
#10楼 2010-07-14 09:51 | Harold Shen      
不错的想法,只是使用 html.substring(11,html.length-14); 让人觉得很不舒服啊,呵呵,可以想想有没有更好的办法,譬如在页面加载完成后,启动一个新线程用ajax加载那些对话框的Html代码,这样是不是更好啊?
 回复 引用 查看   
#11楼[楼主] 2010-07-14 10:04 | BearRui(AK-47)      
@Harold Shen
html.substring(11,html.length-14),这种硬编码确实看起来不舒服,而且新人看到这个代码,如果没注释更是1头雾水,目前觉得这种方式是最快的,所以暂时就这么写了,呵呵。

你说的使用ajax延迟加载对话框的html代码的想法非常不过,如果在html代码处理比较麻烦,比如需要读取数据库才能生成的html代码,使用这种方式还是不错。不过如果html代码比较简单,主要是图片的话,个人觉的就可以不用再ajax去加载html了。

 回复 引用 查看   
#12楼 2010-07-14 11:00 | 軒轅劍      
学习了。。。
 回复 引用   
#13楼 2010-07-14 11:35 | 沧海一栗[未注册用户]
果然高,这都能被你想到
 回复 引用 查看   
#14楼[楼主] 2010-07-14 11:49 | BearRui(AK-47)      
@沧海一栗
谢谢夸奖,:D

 回复 引用 查看   
#15楼 2010-07-14 12:45 | Allen Zhang      
界面非常不错,我现在做的界面最丑了,所以我就用Extjs来做了,呵呵,但发现Extjs有点慢。
 回复 引用 查看   
#16楼[楼主] 2010-07-14 13:11 | BearRui(AK-47)      
@Allen Zhang
extjs 确实比较慢,特别在IE下,以前用ext做过产品,很多企业用户反映很慢,因为企业用户多为IE6

 回复 引用 查看   
#17楼 2010-07-14 13:20 | Allen Zhang      
ExtJS慢也没办法了,我现在没能力做出楼主那样的界面了,呵呵。只能建议客户升级IE版本了。
 回复 引用 查看   
#18楼[楼主] 2010-07-14 13:36 | BearRui(AK-47)      
@Allen Zhang
我们的界面也是美工设计的,您可以建议IE用户安装使用chrome 的frame插件,这样ie就可以使用chrome的内核了

 回复 引用 查看   
#19楼 2010-07-14 15:25 | ZyhFish      
客户端模板的技术已经很成熟,可以看一下网易的评论模板。
 回复 引用 查看   
#20楼[楼主] 2010-07-14 15:58 | BearRui(AK-47)      
@ZyhFish
不是很明白你的意思,这个跟模板有什么关系?

 回复 引用 查看   
#21楼 2010-07-15 09:18 | snowsky      
LZ那个调试工具用的是什么呢?是在IE6下使用的吗?能否分享一下?
 回复 引用 查看   
#22楼[楼主] 2010-07-15 09:28 | BearRui(AK-47)      
@snowsky
httpwatch,使用工具可参考我这篇文章:
http://www.blogjava.net/BearRui/archive/2010/04/28/web_performance_tools.html

 回复 引用 查看   
#23楼 2010-07-15 09:37 | szyicol      
引用BearRui(AK-47):
@Allen Zhang
我们的界面也是美工设计的,您可以建议IE用户安装使用chrome 的frame插件,这样ie就可以使用chrome的内核了



我在IE6上装了,没有反应?

 回复 引用 查看   
#24楼[楼主] 2010-07-15 09:50 | BearRui(AK-47)      
@szyicol
要在自己的页面上加上,<meta http-equiv=”X-UA-Compatible” content=”chrome=1″/>,还需要重启浏览器

我在IE6下测试成功了,速度是快很多,最大的问题就是这个插件太大了,安装后差不多200M,想让用户安装,很难啊

 回复 引用 查看   
#25楼 2010-07-15 10:30 | szyicol      
你搞错了吧?有200多M??

另外,你的意思不是说我每个页面都要加这行代码吧?




 回复 引用 查看   
#26楼[楼主] 2010-07-15 10:35 | BearRui(AK-47)      
@szyicol
安装的时候,提示只需要下载70M,但安装后,在"添加/删除程序"中看到的是219M。

是每个页面都需要加。

 回复 引用 查看   
#27楼 2010-07-15 10:42 | szyicol      
不知道你在哪里下载的?或我们说的不是同一个东西?

http://code.google.com/intl/zh-CN/chrome/chromeframe/

我这里显示只有110M,

不过好像它下载非常之快,不感觉有这么大的东西!!!

比chrome本身还大,寒。。。


 回复 引用 查看   
#28楼[楼主] 2010-07-15 10:44 | BearRui(AK-47)      
@szyicol
当然是同1个东西,不知道是不是操作系统有关系,100多M也很大,你们公司网络好,所以觉的下载快,一般用户就慢了

 回复 引用 查看   
#29楼 2010-07-15 14:38 | szyicol      
弄了几个页面,字体走样了,如何设置?
 回复 引用 查看   
#30楼[楼主] 2010-07-15 15:11 | BearRui(AK-47)      
@szyicol
字体走样了?没碰见过哦,

你试试哪几个页面直接在chrome中显示怎么样

 回复 引用 查看   
#31楼 2010-07-15 15:47 | szyicol      
@BearRui(AK-47)

在chrome中正常,就是在IE中用frame时不正常,编小

 回复 引用 查看   
#32楼[楼主] 2010-07-15 15:50 | BearRui(AK-47)      
@szyicol
这个就不是很清楚了,这个插件我们只是简单试了下,因为还是beta阶段,也不敢正式使用,所以也没深入测试。

 回复 引用 查看   
#33楼 2010-07-16 12:14 | snowsky      
@szyicol
谢谢

 回复 引用 查看   
#34楼 2010-07-20 14:23 | 五子登科      
楼主这种加载注释代码的想法很新颖
 回复 引用 查看   
#35楼[楼主] 2010-07-20 14:30 | BearRui(AK-47)      
@五子登科
谢谢,:D

刷新评论列表  刷新页面  返回页首
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

验证码: 验证码 看不清,换一个

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1776642 ySetWwPQqpk=
首页博问闪存新闻园子招聘知识库
最新IT新闻:
· 传免费对讲机应用Voxer欲融资2000万美元
· 在线编程挑战平台Interview Street帮程序员通过编程竞赛进入名企
· Pinterest发展势头超Facebook:融合社交与电商
· Facebook广告合作伙伴针对时间线推出新服务
· 顶级天使投资人罗恩·康维:创业融资环境非常好
» 更多新闻...
最新知识库文章:
· 编程的艺术:漂亮的代码和漂亮的软件
· GIT分支管理是一门艺术
· 编程:是一门艺术
· 编程是一门艺术吗?
· 对Java初学者的忠告
» 更多知识库文章...

China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务

抓虾
google reader
鲜果
哪吒
QQ邮箱
http://wap.feedsky.com/BearRui
昵称:BearRui(AK-47)
园龄:5年10个月
荣誉:推荐博客
粉丝:127
关注:3

搜索

 

最新随笔

  • 1. 产生唯一随机码的方法分析。
  • 2. URL中允许携带sessionid带来的安全隐患。
  • 3. JS 实现完美include
  • 4. 基于模板的excel导出
  • 5. 实现if elseif else的jsp标签。
  • 6. 记一复杂页面的前端优化(2) - 其他优化
  • 7. 记一复杂页面的前端优化(1) - 不一样的延迟加载
  • 8. 名站技术分析 — tudou网首页下列菜单的弹出效果
  • 9. LESS 让css也支持变量,运算符,include,嵌套规则等等
  • 10. CSS技巧 — 不使用图片实现圆角、阴影、渐变等功能

随笔分类(38)

  • .NET(11)
  • CSS(3)
  • JAVA(2)
  • javascript(4)
  • Life(5)
  • WEB(4)
  • 高性能WEB开发(5)
  • 浏览器(1)
  • 名站技术分析(3)

随笔档案(39)

  • 2010年10月 (1)
  • 2010年8月 (3)
  • 2010年7月 (5)
  • 2010年6月 (4)
  • 2010年5月 (6)
  • 2006年6月 (4)
  • 2006年5月 (7)
  • 2006年4月 (9)

积分与排名

  • 积分 - 178246
  • 排名 - 485

最新评论

阅读排行榜

评论排行榜

推荐排行榜

Copyright ©2012 BearRui(AK-47)