修改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 相关文章推荐
window.onbeforeunload方法在IE下无法正常工作的解决办法
Jan 23 Javascript
jquery ajax执行后台方法
Mar 18 Javascript
Javascript面向对象扩展库代码分享
Mar 27 Javascript
JS设置cookie、读取cookie
Feb 24 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
Mar 29 Javascript
基于JavaScript实现的希尔排序算法分析
Apr 14 Javascript
js匿名函数使用&amp;传参(实例)
Sep 08 Javascript
vue cli升级webapck4总结
Apr 04 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
Feb 20 Javascript
json数据格式常见操作示例
Jun 13 Javascript
vue-dplayer 视频播放器实例代码
Nov 08 Javascript
vue-resource post数据时碰到Django csrf问题的解决
Mar 13 Javascript
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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
php读取文件内容的几种方法详解
2013/06/26 PHP
php中sprintf与printf函数用法区别解析
2014/02/17 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
2016/04/11 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
2019/10/21 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
firefo xml 读写实现js代码
2009/06/11 Javascript
Jquery提交表单 Form.js官方插件介绍
2012/03/01 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
js图片向右一张张滚动效果实例代码
2013/11/23 Javascript
JavaScript获取当前日期是星期几的方法
2015/04/06 Javascript
jquery插件uploadify实现带进度条的文件批量上传
2015/12/13 Javascript
深入理解JavaScript内置函数
2016/06/03 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
浅谈React高阶组件
2018/03/28 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
webpack4 入门最简单的例子介绍
2018/09/05 Javascript
vue cli使用融云实现聊天功能的实例代码
2019/04/19 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
Python time模块详解(常用函数实例讲解,非常好)
2014/04/24 Python
Python pickle模块用法实例分析
2015/05/27 Python
Python随机生成手机号、数字的方法详解
2017/07/21 Python
在CMD命令行中运行python脚本的方法
2018/05/12 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
Python在图片中插入大量文字并且自动换行
2019/01/02 Python
Python turtle绘画象棋棋盘
2019/08/21 Python
python [:3] 实现提取数组中的数
2019/11/27 Python
使用opencv中匹配点对的坐标提取方式
2020/06/04 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
幼师自我鉴定范文
2013/10/01 职场文书
工作态度检讨书
2014/02/11 职场文书
初中军训感想300字
2014/03/05 职场文书
2015年幼儿园卫生保健工作总结
2015/05/12 职场文书
python数据可视化JupyterLab实用扩展程序Mito
2021/11/20 Python