载入一个内容较多的页面的时候,如果不做任何处理,则会在一开始就把全部内容加载出来,影响了性能和体验,所以现在常用分屏加载的功能,就是dom内容出现在屏幕可视范围内的时候,再加载dom节点,起到优化的作用。

  我在项目中用的是textarea,原理就是把需要滚动加载的dom内容放进一个textarea里,然后用一个容器包裹住,当这部分内容高度出现在屏幕中的时候,就释放出textarea中的值append到容器中,实现滚动加载。

  代码不多,js部分就两个函数,直接上代码吧:

  完整版去github看: demo

//定义空间命名
var GLOBAL = {}; //window
$(function () {
GLOBAL.lazyLoad = {
//循环每一个指定textarea,如果在可见区域就写入html,如果有回调函数执行回调函数
eachElem: function ($elem, scollTop, windowH, callback) {
$elem.each(function (index, el) {
var $this = $(el);
var elemTop = $this.parent().offset().top;
var htmls = $this.text(); if ((elemTop > scollTop - 100) && (elemTop - scollTop < windowH)) { //容器出现在屏幕可视范围的时候
if ($this.data("addYet") != 1) {
$this.parent().append((htmls)); //容器添加textarea释放出的html
$this.data("addYet", "1"); if (callback && $.type(callback) == "function") { //如果该html是绑定了js功能的,则传入绑定函数名,比如轮播等,或者其他第三方插件等等
callback(htmls, $this.parent());
}
}
}
});
},
//动态创建dom元素
creatEle: function (targetElm, callback) {
var $elem = $.type(targetElm) == "string" ? $(targetElm) : $("textarea.js_addToDom"),
$window = $(window),
windowH = $window.height(),
that = this;
var _blank = null;
that.eachElem($elem, $window.scrollTop(), windowH, callback); $window.scroll(function () { //滚动时检测
var scrollTop = $(this).scrollTop(); if (_blank) {
clearTimeout(_blank);
}
_blank = setTimeout(function () { //加载dom
that.eachElem($elem, scrollTop, windowH, callback);
}, 300);
});
}
}
GLOBAL.lazyLoad.creatEle("textarea.img_load"); //绑定需要加载的内容
});

html部分:

<img src="img/a1.jpg" alt=""/><br/>
<img src="img/a1.jpg" alt=""/><br/>
<img src="img/a1.jpg" alt=""/><br/> <div class="wrap">
<textarea class="img_load none">
<img src="img/a1.jpg" alt=""/><br/>
</textarea>
</div>

当容器wrap出现在可视范围内后,则会释放textarea中的内容,添加进wrap,起到加载作用.

GLOBAL.lazyLoad.creatEle("textarea.img_load");绑定,如果有js功能,则需要传入第二个参数绑定函数,比如轮播插件flexslider:

function initBuyerShowImg(htmls, $warp) {
$warp.flexslider({
namespace: "",
animation: "slide",
selector: ".slider > li",
pauseOnAction: false,
itemWidth: 150,
controlNav: false,
animationLoop: false
});
} GLOBAL.lazyLoad.creatEle("textarea.js_buyShowslide", initBuyerShowImg);

html:

<!--轮播-->
<div class="buyer-show-slide">
<a href="javascript:;" rel="nofollow" target="_blank" class="buyer-show-cover"></a>
<textarea class="js_buyShowslide none">
<ul class="slider">
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
</ul>
</textarea>
</div>

差不多就这样啦,挺简单的。

dom元素分屏加载的更多相关文章

  1. 关于Echarts的原生js获取DOM元素与动态加载DOM元素的冲突问题

    1.前言: 最近在做的看板项目,因为需要循环加载后台数据,并且用Echarts做数据呈现,所以jQuery和angular等库统统靠边站,Echarts用的是原生js获取DOM元素,至于诸多不兼容等深 ...

  2. ready是先执行的,load后执行,DOM文档的加载步骤

    在jq中在文档载入完毕后有这几种方式去执行指定函数: $(document).ready(function() { // ...代码... }); //document ready 简写 $(func ...

  3. vuejs学习之 项目打包之后的首屏加载优化

    vuejs学习之 项目打包之后的首屏加载优化 一:使用CDN资源 我们在打包时,会将package.json里,dependencies对象里插件打包起来,我们可以将其中的一些使用cdn的方式加载,例 ...

  4. Gemfile分平台加载gem

    Gemfile分平台加载gem 区分平台以便加载不同的web server,象tzinfo-data只适用于windows # Windows does not include zoneinfo fi ...

  5. 滚屏加载--jQuery+PHP实现浏览更多内容

    滚屏加载技术,就是使用Javascript监视滚动条的位置,每次当滚动条到达浏览器窗口底部时,触发一个Ajax请求后台PHP程序,返回相应的数据,并将返回的数据追加到页面底部,从而实现了动态加载,其实 ...

  6. vue项目首屏加载优化实战

    问题 单页面应用的一个问题就是首页加载东西过多,加载时间过长.特别在移动端,单页面应用的首屏加载优化更是绕不开的话题.下面我会写出我在项目中做的一些优化,希望大家能够相互讨论,共同进步. 我的项目vu ...

  7. DOM编程以及domReady加载的几种方式

    1,关于DOM编程       DOM编程主要是对dom树节点进行操作,所以你必须掌握基本的节点类型,如何去获取节点名字以及值(这些相关知识你可以去网上查,这里推荐一个慕课学习网站->https ...

  8. react 首屏加载优化

    react 首屏加载优化,原本是在入口HTML文件中加载loading动画,但是部署在测试环境上的时候一直无法显示loading的部分,也是奇怪了,我们测试环境的部署一直跟本地的都不太一样,内外网的转 ...

  9. jQuery 超屏加载

    jQuery 超屏加载,当文档超出屏幕的高度时,加载最新下个列数据 $(window).scroll(function () { var height = $(document).height(); ...

随机推荐

  1. mysql 主从,双主同步

    1.创建用户并设置远程访问授权 1). A上添加: //ip地址为B的ip地址,用于B访问 ' with grant option; 2). B上添加://ip地址为A的ip地址,用于A访问 ' wi ...

  2. 菜鸟nginx源码剖析数据结构篇(一)动态数组ngx_array_t[转]

    菜鸟nginx源码剖析数据结构篇(一)动态数组ngx_array_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn ...

  3. 84 落单的数 III

    原题网址:http://www.lintcode.com/zh-cn/problem/single-number-iii/# 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到 ...

  4. day 42 01--CSS的引入方式及CSS选择器

    01--CSS的引入方式及CSS选择器   本节目录 一 CSS介绍 二 行内样式 三 内接样式 四 外接样式 五 CSS的选择器 六 CSS的高级选择器 七 CSS的属性选择器 八 CSS的伪类选择 ...

  5. 解决编译GCC内存不足的错误

    近期在使用阿里和腾讯的云服务器,由于只是测试用所以只租用了廉价512的内存,在编译gcc时遇到错误,表面上看只是编译错误,并且原因不明,纠结了几次之后猜测应该是由于系统资源不足导致的,所以尝试增加系统 ...

  6. 【踩坑】nextSibling 和nextElementSibling的区别

    DOM 使用nextSibling属性返回指定节点之后的下一个兄弟节点,(即:相同节点树层中的下一个节点). nextSibling属性与nextElementSibling属性的差别: nextSi ...

  7. 19-10-24-H

    H H H H H H ZJ一下: T1只会暴力,测试点分治. (表示作者的部分分并没有给够,暴力加部分表按测试点分类可以得60吧……) T2先直接手玩第一个子任务. 然后就$Find$了一个神奇的( ...

  8. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]

    模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override).   1   2{<HeadFirst设计模式>之模板方法模式 }   3{ 编译工具: Del ...

  9. CentOS 6.5 Apache+SVN配置

    yum -y install subversion #安装SVN svnserve -- version #查看svn版本信息确定是否安装 yum -y install httpd #安装Apache ...

  10. 关于mybatis-config.xml文件的基础解释

    今天是我第一天落户博客园,想一想从mybatis框架开始写起吧.mybatis框架与Hibernate框架相比来说,专注于SQL语句,对SQL语句的要求比较高吧. 我觉得,对于mybatis框架来说, ...