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 相关文章推荐
深入领悟JavaScript中的面向对象
Nov 18 Javascript
jQuery中insertAfter()方法用法实例
Jan 08 Javascript
对JavaScript中this指针的新理解分享
Jan 31 Javascript
jquery实现图片放大镜功能
Nov 23 Javascript
AngularJs 动态加载模块和依赖
Sep 15 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
Sep 21 Javascript
开发Vue树形组件的示例代码
Dec 21 Javascript
JS实现显示当前日期的实例代码
Jul 03 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
Nov 04 Javascript
微信小程序事件流原理解析
Nov 27 Javascript
vue2和vue3的v-if与v-for优先级对比学习
Oct 10 Javascript
浅谈react路由传参的几种方式
Mar 23 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之第八天
2006/10/09 PHP
php中邮箱地址正则表达式实现与详解
2012/04/24 PHP
thinkphp 多表 事务详解
2013/06/17 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
2014/07/12 PHP
php实现删除指定目录下相关文件的方法
2014/10/20 PHP
PHP实现类似题库抽题效果
2018/08/16 PHP
统计PHP目录中的文件数方法
2019/03/05 PHP
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
2008/09/25 Javascript
jQuery 源代码显示控件 (Ajax加载方式).
2009/05/18 Javascript
javascript语言结构小记(一)
2011/09/10 Javascript
JS通过相同的name进行表格求和代码
2013/08/18 Javascript
ie下$.getJSON出现问题的解决方法
2014/02/12 Javascript
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
2016/07/07 Javascript
jquery Ajax 全局调用封装实例详解
2017/01/16 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
JavaScript 有用的代码片段和 trick
2018/02/22 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
Node 搭建一个静态资源服务器的实现
2019/05/20 Javascript
js实现滑动进度条效果
2020/08/21 Javascript
[03:07]【DOTA2亚洲邀请赛】我们,梦开始的地方
2017/03/07 DOTA
Python 代码性能优化技巧分享
2012/08/07 Python
跟老齐学Python之使用Python查询更新数据库
2014/11/25 Python
Python构建XML树结构的方法示例
2017/06/30 Python
python自动化报告的输出用例详解
2018/05/30 Python
Python爬虫框架Scrapy基本用法入门教程
2018/07/26 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
2020/02/23 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
大学军训感言1000字
2014/02/25 职场文书
林肯就职演讲稿
2014/05/19 职场文书
2014年干部培训工作总结
2014/12/17 职场文书
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫