一、插件简介
现在很多网站都在使用DOM延时加载技术,确实能很有效的降低页面压力,提升整个页面的渲染速度,其实原理很简单,把非首屏的内容放在textarea或者注释、javascript字符串或者其他能保证内容不被渲染的地方,监测scroll 、resize、load事件,当即将滚动至待渲染容器时,从textarea或者其他中取出内容,放入容器渲染即可。
项目需要,自己写了个DOM延时渲染插件,特点是轻巧,插件几乎只负责监测页面视口位置,通知哪个容器该渲染,而具体如何渲染的工作交给用户,你可以选择自己喜欢的方式,比如放到textarea里面或者注释里面,至于你用什么方式取出内容,如何放到容器里面,以及内容和容器的关系维护,都由用户来做,本插件不负责。
当然,为了照顾部分用户,插件里面默认加入了textarea的方式,使用方式很简单,如下
1
2
3
4
5
6
7
8
<!-- 原HTML结构 -->
<div id="1">id=1的容器</div>
<div id="2">id=2的容器</div>
...
<!-- 现HTML结构 -->
<div id="1"><textarea>id=1的容器</textarea></div>
<div id="2"><textarea>id=2的容器</textarea></div>
...
1
2
3
/* css部分 */
div { height : 200px ; } /* 外部容器必须固定高度 */
textarea { display : none ; }
1
2
3
4
// javascript部分
$.lazydom ( {
items : $( "div" )
} ) ;
如上配置后,插件默认将以如下方式渲染,用户不必再做配置:
1
2
3
4
5
6
7
// 默认渲染方式
function ( ) {
var textarea = this .children ( 'textarea' ) ;
if ( textarea.length > 0 ) {
this .html ( textarea.val ( ) ) ;
}
}
当然,更懒一点化,上面 items : $(“div”) 这个也不用写,只要在需要延时加载的容器上加上一个 “lazydom”样式名即可。
二、使用方法
基本使用方式有两种一种扩展到了jquery对象下,适用于根据整个页面滚动判断加载的情况,适用于大部分需求;另一种扩展到了jquery.fn下,用于根据某一容器滚动条判断加载的情况,具体参数配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//根据整个页面(window)的滚动判断加载,推荐此方式
$.lazydom ( {
items : null , //需要延时的DOM集合,传入数组或表达式。默认$(".lazydom")
render : function ( ) {
var textarea = this .children ( 'textarea' ) ;
if ( textarea.length & gt; 0 ) {
this .html ( textarea.val ( ) ) ;
}
} , //渲染处理 ,默认处理函数为提前item中textarea值
direction : "y" , //方向 x,y,xy,默认y
delay : 0 , //延时响应时间,压力比较大时,可设置scroll时多少时间响应一次
before : 100 //提前量,即可设置提前多少像素加载
} ) ;
//在某一容器内根据容器滚动条判断加载,配置同上
$( obj) .lazydom ( {
items : null , //需要延时的DOM集合,传入数组或表达式。默认$(".lazydom")
render : function ( ) {
var textarea = this .children ( 'textarea' ) ;
if ( textarea.length & gt; 0 ) {
this .html ( textarea.val ( ) ) ;
}
} , //渲染处理 ,默认处理函数为提前item中textarea值
direction : "y" , //方向 x,y,xy,默认y
delay : 0 , //延时响应时间,压力比较大时,可设置scroll时多少时间响应一次
before : 100 //提前量,即可设置提前多少像素加载
} ) ;
特别说明:
1、本插件为了轻巧和大多数项目需求,需要延时渲染的容器必须要在css中固定宽高(目前多数网站只是在首页使用延时加载技术,首页一般各个区域大小都固定),容器不固定宽高的方式笔者正在考虑中,兼容更多需求必然以牺牲轻巧性能为代价。
2、本插件支持横向,纵向,横纵同时三种加载方式,但为适应大多数需求,加载方式均为从上往下,或者从左往右的方式,不支持从下往上和从右往左
3、为提升效率,加载顺序为上述顺序,如果用户传入自定义items集合的化,也请按照从上往下或者从右往左的自然顺序排序
4、如果使用第二种方式,调用对象如果为$(document)或者$(“body”)情况,判断将不准确,此类情况请使用第一种方式
待改进问题:
1、jquery $(window).scrollTop()或者$(document).scrollTop()在IE下值为0,原因是jquery检测页面启用了怪癖模式
这里解决办法没有采用新的获取scrollTop的方法,我是先更改了jQuery.support.boxModel值,取完scrollTop再更改回去,这投机取巧方法肯定有不合理之处,但懒得重新写一个方法,暂时先用着
1
2
3
4
5
6
7
8
9
10
if ( isWindow && ! jQuery.support .boxModel ) {
//hack for jquery $(window).scrollTop() bug in IE
jQuery.support .boxModel = true ;
var obj = {
top : self.scrollTop ( ) + self.height ( ) ,
left : self.scrollLeft ( ) + self.width ( )
} ;
jQuery.support .boxModel = false ;
return obj;
...
四、实例
实例一:纵向加载
重新加载
第1个框
第2个框
第3个框
第4个框
第5个框
第6个框
第7个框
第8个框
第9个框
第10个框
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
<div id="ex1">
<div>第1个框<textarea>第1个框已加载</textarea></div>
<div>第2个框<textarea>第2个框已加载</textarea></div>
<div>第3个框<textarea>第3个框已加载</textarea></div>
<div>第4个框<textarea>第4个框已加载</textarea></div>
<div>第5个框<textarea>第5个框已加载</textarea></div>
<div>第6个框<textarea>第6个框已加载</textarea></div>
<div>第7个框<textarea>第7个框已加载</textarea></div>
<div>第8个框<textarea>第8个框已加载</textarea></div>
<div>第9个框<textarea>第9个框已加载</textarea></div>
<div>第10个框<textarea>第10个框已加载</textarea></div>
</div>
1
2
3
#ex1 { width : 400px ; height: 300px ; overflow: scroll ; border: 1px solid #ccc ; }
#ex1 div { width : 398px ; height: 196px ; border: 1px solid blue ; background-color : #b5b5b5 ; text-align: center ; float: left ; }
#ex1 div textarea { display : none ; }
1
$( '#ex1' ) .lazydom ( { items : $( '#ex1>div' ) } ) ;
实例二:横向加载
重新加载
第1个框
第2个框
第3个框
第4个框
第5个框
第6个框
第7个框
第8个框
第9个框
第10个框
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div id="ex2">
<div class="container">
<div>第1个框<textarea>第1个框已加载</textarea></div>
<div>第2个框<textarea>第2个框已加载</textarea></div>
<div>第3个框<textarea>第3个框已加载</textarea></div>
<div>第4个框<textarea>第4个框已加载</textarea></div>
<div>第5个框<textarea>第5个框已加载</textarea></div>
<div>第6个框<textarea>第6个框已加载</textarea></div>
<div>第7个框<textarea>第7个框已加载</textarea></div>
<div>第8个框<textarea>第8个框已加载</textarea></div>
<div>第9个框<textarea>第9个框已加载</textarea></div>
<div>第10个框<textarea>第10个框已加载</textarea></div>
</div>
</div>
1
2
3
4
#ex2 { width : 398px ; height: 196px ; overflow: scroll ; border: 1px solid #ccc ; }
#ex2 .container { width : 4000px ; height: 200px ; overflow: visible ; }
#ex2 .container div { width : 398px ; height: 196px ; border: 1px solid blue ; background-color : #b5b5b5 ; text-align: center ; float: left ; }
#ex2 .container div textarea { display : none ; }
1
2
3
4
$( '#ex2' ) .lazydom ( {
items : $( '#ex2>.container>div' ) ,
direction : 'x'
} ) ;
实例三,根据整个页面(window)的滚动判断加载
点击查看demo
如果您有建议,欢迎留言