修改jquery.lazyload.js实现页面延迟载入


Posted in Javascript onDecember 22, 2010

虽然实现了延迟载入的视觉效果,但是通过httpwatch等工具就可以看到,页面载入完毕后又发布很多空请求,而空请求就是由这些被替换过的img标签产生的,空请求也会一定程度上增加页面的打开时间,所以jquery.lazyload.js并未真生的实现页面延迟载入。
我对jquery.lazyload.js做了一些修改,实现了页面的延迟载入,不仅仅是图片,html代码同样可以延迟载入,大大减少了页面发出的请求数,提高了页面的打开速度。
修改后的jquery.lazyload.js代码如下:
jquery.lazyload.js

/* 
* Lazy Load - jQuery plugin for lazy loading images 
* 
* Copyright (c) 2007-2009 Mika Tuupola 
* 
* Licensed under the MIT license: 
* http://www.opensource.org/licenses/mit-license.php 
* 
* Project home: 
* http://www.appelsiini.net/projects/lazyload 
* 
* Version: 1.5.0 
* 
* Modify by @cnbaiying 
* Modify time: 2010-12-16 
*/ 
(function($) { 
$.fn.lazyload = function(options) { 
var settings = { 
threshold : 0, //阀值 
failurelimit : 0, 
event : "scroll", 
effect : "show", 
container : window 
}; 
if(options) { 
$.extend(settings, options); 
} 
/* Fire one scroll event per scroll. Not one scroll event per image. */ 
var elements = this; 
if ("scroll" == settings.event) { 
$(settings.container).bind("scroll", function(event) { 
var counter = 0; 
elements.each(function() { 
if ($.abovethetop($(this).parent(), settings) || $.leftofbegin($(this).parent(), settings)) { 
/* Nothing. */ 
} else if (!$.belowthefold($(this).parent(), settings) && !$.rightoffold($(this).parent(), settings)) { 
$(this).trigger("appear"); 
} else { 
if (counter++ > settings.failurelimit) { 
return false; 
} 
} 
}); 
/* Remove image from array so it is not looped next time. */ 
var temp = $.grep(elements, function(element) { 
return !element.loaded; 
}); 
elements = $(temp); 
}); 
} 
this.each(function() { 
var self = this; 
/* When appear is triggered load original image. */ 
$(self).one("appear", function() { 
if (!this.loaded) { 
//alert($(self).parent().html($(self).html())); 
var tmp_str = $(self).html(); 
tmp_str = tmp_str.replace("<", "<"); 
tmp_str = tmp_str.replace(">", ">"); 
$(self).parent().append(tmp_str); 
self.loaded = true; 
} 
}); 
/* When wanted event is triggered load original image */ 
/* by triggering appear. */ 
if ("scroll" != settings.event) { 
$(self).bind(settings.event, function(event) { 
if (!self.loaded) { 
$(self).trigger("appear"); 
} 
}); 
} 
}); 
/* Force initial check if images should appear. */ 
$(settings.container).trigger(settings.event); 
return this; 
}; 
/* Convenience methods in jQuery namespace. */ 
/* Use as $.belowthefold(element, {threshold : 100, container : window}) */ 
$.belowthefold = function(element, settings) { 
if (settings.container === undefined || settings.container === window) { 
var fold = $(window).height() + $(window).scrollTop(); 
} else { 
var fold = $(settings.container).offset().top + $(settings.container).height(); 
} 
return fold <= $(element).offset().top - settings.threshold; 
}; 
$.rightoffold = function(element, settings) { 
if (settings.container === undefined || settings.container === window) { 
var fold = $(window).width() + $(window).scrollLeft(); 
} else { 
var fold = $(settings.container).offset().left + $(settings.container).width(); 
} 
return fold <= $(element).offset().left - settings.threshold; 
}; 
$.abovethetop = function(element, settings) { 
if (settings.container === undefined || settings.container === window) { 
var fold = $(window).scrollTop(); 
} else { 
var fold = $(settings.container).offset().top; 
} 
return fold >= $(element).offset().top + settings.threshold + $(element).height(); 
}; 
$.leftofbegin = function(element, settings) { 
if (settings.container === undefined || settings.container === window) { 
var fold = $(window).scrollLeft(); 
} else { 
var fold = $(settings.container).offset().left; 
} 
return fold >= $(element).offset().left + settings.threshold + $(element).width(); 
}; 
/* Custom selectors for your convenience. */ 
/* Use as $("img:below-the-fold").something() */ 
$.extend($.expr[':'], { 
"below-the-fold" : "$.belowthefold(a, {threshold : 0, container: window})", 
"above-the-fold" : "!$.belowthefold(a, {threshold : 0, container: window})", 
"right-of-fold" : "$.rightoffold(a, {threshold : 0, container: window})", 
"left-of-fold" : "!$.rightoffold(a, {threshold : 0, container: window})" 
}); 
})(jQuery);

下面是测试页面的html代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<meta name="keywords" content="汽车图片,汽车图片壁纸, 汽车图片桌面, 汽车图片库,汽车图片大全" /> 
<meta name="description" content="汽车图片,网上车市汽车图片大全频道为网友提供各种汽车图片及美女图片下载,各种车型汽车图片桌面,汽车图片壁纸,车展美女图片,美女车模图片等。精彩图片,尽在网上车市。" /> 
<title>【汽车图片|汽车美女图片-汽车图片大全】-网上车市</title> 
<style> 
.switch_textarea {display:none;} 
.div_style {width:600px; height:400px; } 
</style> 
<script type="text/javascript" src="jquery.1.4.4.js"></script> 
<script type="text/javascript" src="lazyload.jquery.js"></script> 
<script> 
$().ready(function(){ 
$(".switch_textarea").lazyload(); 
}); 
</script> 
</head> 
<body> 
<H2>第1张图</H2> 
<div class="div_style"><textarea class="switch_textarea"><img src="4bdfd2385fd03.jpg" /></textarea></div> 
<H2>第2张图</H2> 
<div class="div_style"><textarea class="switch_textarea"><img src="4bdfd2366adec.jpg" /></textarea></div> 
<H2>第3张图</H2> 
<div class="div_style"><textarea class="switch_textarea"><img src="4bdfd233b8da4.jpg" /></textarea></div> 
<H2>第4张图</H2> 
<div class="div_style"><textarea class="switch_textarea"><img src="4bdfd231a0fd8.jpg" /></textarea></div> 
<H2>第5张图</H2> 
<div class="div_style"><textarea class="switch_textarea"><img src="4bdfd22e68f56.jpg" /></textarea></div> 
<H2>第6张图</H2> 
<div class="div_style"><textarea class="switch_textarea"><img src="4bdfd22c55a5d.jpg" /></textarea></div> 
<H2>第7张图</H2> 
<div class="div_style"><textarea class="switch_textarea"><img src="4bdfd2278872b.jpg" /></textarea></div> 
<H2>第8张图</H2> 
<div class="div_style"><textarea class="switch_textarea"><img src="4bdfd224a0f6e.jpg" /></textarea></div> 
<H2>第9张图</H2> 
<div class="div_style"><textarea class="switch_textarea"><img src="4bdfd21fb42bc.jpg" /></textarea></div> 
</body> 
</html>

测试页面的html代码中将所有要载入的图片都放到了textarea标签中,其目的就是防止页面载入时这些img标签向服务器发出请求,从而实现减少不必要的请求数,实际应用中也可以将不需第一次载入的html代码放到textarea中。
Javascript 相关文章推荐
Mootools 1.2教程 排序类和方法简介
Sep 15 Javascript
javascript深入理解js闭包
Jul 03 Javascript
JavaScript高级程序设计 客户端存储学习笔记
Sep 10 Javascript
Node.js中使用mongoskin操作mongoDB实例
Sep 28 Javascript
详解基于Bootstrap扁平化的后台框架Ace
Nov 27 Javascript
JSON 对象未定义错误的解决方法
Sep 29 Javascript
AngularJS打开页面隐藏显示表达式用法示例
Dec 25 Javascript
Vue.js系列之项目搭建(1)
Jan 03 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
Feb 08 Javascript
JS实现点击拉拽轮播图pc端移动端适配
Sep 05 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
Apr 25 Javascript
如何解决jQuery 和其他JS库的冲突
Jun 22 jQuery
jquery插件 autoComboBox 下拉框
Dec 22 #Javascript
Jquery截取中文字符串的实现代码
Dec 22 #Javascript
jquery里的each使用方法详解
Dec 22 #Javascript
jQuery学习笔记之jQuery的动画
Dec 22 #Javascript
jQuery学习笔记之jQuery的事件
Dec 22 #Javascript
jQuery学习笔记之jQuery的DOM操作
Dec 22 #Javascript
jQuery学习笔记之jQuery选择器的使用
Dec 22 #Javascript
You might like
php中几种常见安全设置详解
2010/04/06 PHP
php针对cookie操作的队列操作类实例
2014/12/10 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
JS不间断向上滚动效果代码
2013/12/25 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
JavaScript基础知识及常用方法总结
2016/01/10 Javascript
AngularJS控制器之间的数据共享及通信详解
2016/08/01 Javascript
深入理解React中es6创建组件this的方法
2016/08/29 Javascript
JS+HTML5实现的前端购物车功能插件实例【附demo源码下载】
2016/10/17 Javascript
axios学习教程全攻略
2017/03/26 Javascript
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
基于vue-video-player自定义播放器的方法
2018/03/21 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
JavaScrip如果基于url实现图片下载
2020/07/03 Javascript
js实现简单的轮播图效果
2020/12/13 Javascript
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
[02:11]2016国际邀请赛中国区预选赛最美TA采访现场玩家
2016/06/28 DOTA
如何运行Python程序的方法
2013/04/21 Python
Python中的异常处理学习笔记
2015/01/28 Python
python 高效去重复 支持GB级别大文件的示例代码
2018/11/08 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
Python实现FTP文件定时自动下载的步骤
2020/12/19 Python
自我鉴定思想方面
2013/10/07 职场文书
总经理职责范文
2013/11/08 职场文书
大学生实习思想汇报
2014/01/12 职场文书
面包店的创业计划书范文
2014/01/16 职场文书
蛋糕店创业计划书
2014/05/06 职场文书
Python基础之hashlib模块详解
2021/05/06 Python
python中%格式表达式实例用法
2021/06/18 Python
详解Python内置模块Collections
2022/03/22 Python