Web 前端设计模式--Dom重构 提高显示性能


Posted in Javascript onOctober 22, 2010

1. 设计场景

首页那边有一个产品浏览的版块在延迟载入的时候,将我所有的隐藏帧的项都显示出来(如图,我本意是显示两行图片,可是在载入卡住,将下面一些隐藏元素都显示出来了),整体画面粗糙凌乱,整个网页完全载入并顺利运行的时间延迟超过5秒,在这种交互性极强的在线印刷网站是非常致命的,这给用户一种极其糟糕的Web体验,并归结为网站的不稳定...

此时不能责怪公司的服务器烂,网速卡之类的,那样很可能会导致老大对我一顿胖揍甚至扣奖金...
所以只能从网站性能方面进行改良...

2.设计目标
减少页面载入时不必要的元素,构建一个轻量级的Web页面...

3.解决方案
当初我接到这个Case的时候,最初的设计方案毫无疑问是隐藏帧做法,这是最好用也是最容易简单的,它的方法就是将四个标签tab(画册,手提袋,挂历,包装)所对应的四个Div全部载入页面,并在载入时显示第一个tab(画册)的Div,在鼠标轮滑过tab的时候显示相应tab标签的Div,隐藏其他tab标签的Div...
因此才会出现上述的情况,我想起我前一天晚上看的一本Web设计模式的书,上面的一段话引曾起我的注意:使用页面元素更新来重构Dom树往往比隐藏帧的性能要高得多...所以此时我的想法便是重构Dom树...

Web页面的源码很简单,重要的在于 id="tabcontent" 的那个Div,它是关键,它里面元素的变换取决于上面的四个<li>标签,当鼠标经过时就将不同的内容更新到Div里面,这使得页面不用一开始就将所有的元素都载入,并进行不厌其烦的隐藏和显示,实现代码如下。。。
这样,就有四个id分别tabcontent1,tabcontent2,tabcontent3,tabcontent4为Div不断的轮换 替换进id="tabcontent"的 Div里面 ,尝试一下,确实性能高了很多...

<div class="menu"> 
<ul> 
<li><a href="#" id="tablink1" onclick="return false">包装盒 </a></li> 
<li><a href="#" id="tablink2" onclick="return false">画册 </a></li> 
<li><a href="#" id="tablink3" onclick="return false">手提袋 </a></li> 
<li><a href="#" id="tablink4" onclick="return false">三折页 </a></li> 
</ul> 
</div> 
<div class="border2 w1" id="tabcontent"> 
</div>

/隐藏标签 
function tabs(i) 
{ 
var num,ids,ordnum; 
switch(i) 
{ 
case 1:{ append(1,1,"f"); break;} 
case 2:{ append(2,5,"s"); break;} 
case 3:{ append(3,9,"t"); break;} 
case 4:{ append(4,13,"fo"); break;} 
} 
} //更新数据 
function append(i,j,type) 
{ 
var str="<div class='show_img h3' id='tabcontent"+i+"'>"; 
str+="<div id='"+type+"demo' class='demo'>"; 
str+="<div id='"+type+"indemo' class='indemo'>"; 
str+="<div id='"+type+"demo1' class='demo1'>"; 
str+="<a href='#'><img src='img/"+j+".png' border='0' /></a>"; 
str+="<a href='#'><img src='img/"+ (++j) +".png' border='0' /></a>"; 
str+="<a href='#'><img src='img/"+ (++j) +".png' border='0' /></a>"; 
str+="<a href='#'><img src='img/"+ (++j) +".png' border='0' /></a>"; 
str+="</div>"; 
str+="<div id='"+type+"demo2' class='demo2'></div>"; 
str+="</div></div><div>"; 
$("#tabcontent").html(str); 
}

到这里应该算结束,可是我突然想起一个问题,这种做法其实和jQuery中的hover思想是一样的,而这边是进行轮询的Dom元素更新,也就是说每一次鼠标移动标签都要有一些数据要发送和接收,相对与上面小段数据是没什么影响,但是大的Case中使用这种方法就不可行,因为它的Dom元素更新可能是十几kb甚至几十kb的数据流,这无疑给Web页面的性能带来极大的挑战...

因此,我又做了一个小小的改动,那就是使用Dom重构+隐藏帧用法,在页面第一次载入的时候,先载入的是第一个标签所对应的Div,即画册所对应的Div,当鼠标移到其他tab标签时候,追加该标签所对应的元素(该元素若存在则去掉隐藏并显示,不存在则追加),并隐藏其他Tab标签所对应的Div标签...该方法有个名称,叫做“多阶段下载...”,这样就不用每次都进行元素更新,代码如下...

//隐藏标签 
function tabs(i) 
{ 
for(var j=1;j<5;j++) 
{ 
$("#tabcontent"+j).hide(); 
} 
$("#tabcontent"+i).show(); 
var num,ids,ordnum; 
var len= $("#tabcontent"+i).length;//这句话很重要,它是杜绝将元素重复载入的判断(如果该元素存在,就不需再次追加) 
if(len==0) 
{ 
switch(i) 
{ 
case 1:{ append(1,1,"f"); break;} 
case 2:{ append(2,5,"s"); break;} 
case 3:{ append(3,9,"t"); break;} 
case 4:{ append(4,13,"fo"); break;} 
} 
} 
} //载入数据 
function append(i,j,type) 
{ 
var str="<div class='show_img h3' id='tabcontent"+i+"'>"; 
str+="<div id='"+type+"demo' class='demo'>"; 
str+="<div id='"+type+"indemo' class='indemo'>"; 
str+="<div id='"+type+"demo1' class='demo1'>"; 
str+="<a href='#'><img src='img/"+j+".png' border='0' /></a>"; 
str+="<a href='#'><img src='img/"+ (++j) +".png' border='0' /></a>"; 
str+="<a href='#'><img src='img/"+ (++j) +".png' border='0' /></a>"; 
str+="<a href='#'><img src='img/"+ (++j) +".png' border='0' /></a>"; 
str+="</div>"; 
str+="<div id='"+type+"demo2' class='demo2'></div>"; 
str+="</div></div><div>"; 
$("#tabcontent").append(str); 
}

4.设计小结
网站的性能提高了,既不会出现在首次载入的时候页面元素负荷过重而造成的延迟,也不会因为Dom树的不断更新而造成页面显示性能低下...

如图:
Web 前端设计模式--Dom重构 提高显示性能

源码下载 /201010/yuanma/DomForm.rar

Javascript 相关文章推荐
jQuery EasyUI 开源插件套装 完全替代ExtJS
Mar 24 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
Apr 29 Javascript
详细分析使用AngularJS编程中提交表单的方式
Jun 19 Javascript
js实现仿阿里巴巴城市选择框效果实例
Jun 24 Javascript
原生js实现新闻列表展开/收起全文功能
Jan 20 Javascript
jQuery EasyUI Layout实现tabs标签的实例
Sep 26 jQuery
vue.js  父向子组件传参的实例代码
Oct 29 Javascript
three.js中文文档学习之如何本地运行详解
Nov 20 Javascript
微信小程序使用Promise简化回调
Feb 06 Javascript
vue-router相关基础知识及工作原理
Mar 16 Javascript
使用RN Animated做一个“添加购物车”动画的方法
Sep 12 Javascript
JavaScript指定断点操作实例教程
Sep 18 Javascript
jQuery中add实现同时选择两个id对象
Oct 22 #Javascript
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
Oct 22 #Javascript
为jQuery.Treeview添加右键菜单的实现代码
Oct 22 #Javascript
使用jQuery模板来展现json数据的代码
Oct 22 #Javascript
jQuery 表单验证扩展(四)
Oct 20 #Javascript
jQuery 表单验证扩展(三)
Oct 20 #Javascript
jQuery 表单验证扩展代码(二)
Oct 20 #Javascript
You might like
php利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
11个PHP 分页脚本推荐
2011/08/15 PHP
PHP自带方法验证邮箱是否存在
2016/02/01 PHP
php 防止表单重复提交两种实现方法
2016/11/03 PHP
JavaScript 事件查询综合
2009/07/13 Javascript
基于jQuery的合并表格中相同文本的相邻单元格的代码
2011/04/06 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
轻松创建nodejs服务器(2):nodejs服务器的构成分析
2014/12/18 NodeJs
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
JS实现自动定时切换的简洁网页选项卡效果
2015/10/13 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
JSON 数据格式详解
2017/09/13 Javascript
详解微信小程序中组件通讯
2018/10/30 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
js实现鼠标拖曳效果
2020/12/30 Javascript
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
[39:00]Optic vs VP 2018国际邀请赛淘汰赛BO3 第三场 8.24
2018/08/25 DOTA
Python正则表达式介绍
2012/08/06 Python
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
分享一下如何编写高效且优雅的 Python 代码
2017/09/07 Python
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
python实现简单的单变量线性回归方法
2018/11/08 Python
Python实现点云投影到平面显示
2020/01/18 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
2020/05/29 Python
马歇尔耳机官网:Marshall Headphones
2020/02/04 全球购物
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
超市端午节活动方案
2014/01/23 职场文书
学生会干部自荐信
2014/02/04 职场文书
2014年开学第一课活动方案
2014/03/06 职场文书
《永远的白衣战士》教学反思
2014/04/25 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
Python入门之基础语法详解
2021/05/11 Python
深入理解Pytorch微调torchvision模型
2021/11/11 Python