Jquery实现图片预加载与延时加载的方法
本文实例讲述了Jquery实现图片预加载与延时加载的方法。分享给大家供大家参考。具体分析如下:
有很多项目经常会需要判断图片加载完成后执行相应的操作,或者需要图片延迟加载,网上虽然已经有很不错的插件,但要为这些效果还得单独加载一个插件的话总感觉有点不舒服,干脆自己写了个方法:
functionloadimg(arr,funLoading,funOnLoad,funOnError){
varnumLoaded=0,
numError=0,
isObject=Object.prototype.toString.call(arr)==="[objectObject]"?true:false;
vararr=isObject?arr.get():arr;
for(ainarr){
varsrc=isObject?$(arr[a]).attr("data-src"):arr[a];
preload(src,arr[a]);
}
functionpreload(src,obj){
varimg=newImage();
img.onload=function(){
numLoaded++;
funLoading&&funLoading(numLoaded,arr.length,src,obj);
funOnLoad&&numLoaded==arr.length&&funOnLoad(numError);
};
img.onerror=function(){
numLoaded++;
numError++;
funOnError&&funOnError(numLoaded,arr.length,src,obj);
}
img.src=src;
}
}参数说明:
arr:可以是存放图片路径的一个数组,也可以是选取到的img的jquery对象;
funLoading:每一个单独的图片加载完成后执行的操作;
funOnLoad:全部图片都加载完成后的操作;
funOnError:单个图片加载出错时的操作。
如:
varimgonload=function(errors){
/*errors:加载出错的图片数量;*/
console.log("loaded,"+errors+"imagesloadederror!");
}
varfunloading=function(n,total,src,obj){
/*
n:已加载完成的数量;
total:总共需加载的图片数量;
src:当前加载完成的图片路径;
obj:当loadimg函数中传入的arr为存放图片路径的数组时,obj=src,是图片路径,
当arr为jquery对象时,obj是当前加载完成的imgdom对象。
*/
console.log(n+"of"+total+"picloaded.",src);
varnewimg=document.createElement("img");
newimg.src=src;
$("body").append(newimg).fadeIn();
}
varfunloading_obj=function(n,total,src,obj){
console.log(n+"of"+total+"picloaded.",src);
$(obj).attr("src",src);
$(obj).fadeIn(200);
}
varfunOnError=function(n,total,src,obj){
console.log("the"+n+"stimgloadedError!");
}调用示例:
console.log("loading...");
loadimg($("img"),funloading_obj,imgonload,funOnError);
/*loadimg(["http://pic22.nipic.com/20120619/9607634_212642465144_2.jpg",
"/20120531/1670912_103610084349_2.jpg",
"/20120616/4952071_130629530136_2.jpg",
"/20120610/1723580_105037029000_2.jpg",
"http://pic22.nipic.com/20120617/2572038_125013326121_2.jpg"
],funloading,imgonload,funOnError);*/上面算是原生态写法了,下面我们介绍一个基于LazyLoad,延迟加载图片的jQuery插件
LazyLoad依赖于jQuery.请将下列代码加入页面head区域:
<scriptsrc="jquery.js"type="text/javascript"></script> <scriptsrc="jquery.lazyload.js"type="text/javascript"></script>
你必须修改HTML代码.在src属性中设置展位符图片,demo页面使用1x1像素灰色GIF图片.并且需要将真实图片的URL设置到data-original属性.这里可以定义特定的class以获得需要延迟加载的图片对象.通过这种方法你可以简单地控制插件绑定.
<imgclass="lazy"src="img/grey.gif"data-original="img/example.jpg" width="640"heigh="480">
处理图片的代码如下.
$("img.lazy").lazyload();这将使所有class为lazy的图片将被延迟加载.可以参考基本选项demo
设置敏感度
几乎所有浏览器的JavaScript都是激活的.然而可能你仍希望能在不支持JavaScript的客户端展示真实图片.当浏览器不支持JavaScript时优雅降级,你可以将真实的图片片段在写<noscript>标签内.
<imgclass="lazy"src="img/grey.gif"data-original="img/example.jpg" width="640"heigh="480"> <noscript><imgsrc="img/example.jpg"width="640"heigh="480"></noscript>
可以通过CSS隐藏占位符.
.lazy{
display:none;
}在支持JavaScript的浏览器中,你必须在DOMready时将占位符显示出来,这可以在插件初始化的同时完成.
$("img.lazy").show().lazyload();这些都是可选的,但如果你希望插件平稳降级这些都是应该做的.
设置敏感度
默认情况下图片会出现在屏幕时加载.如果你想提前加载图片,可以设置threshold选项,设置threshold为200令图片在距离屏幕200像素时提前加载.
$("img.lazy").lazyload({threshold:200});
占位图片
你还可以设定一个占位图片并定义事件来触发加载动作.这时需要为占位图片设定一个URL地址.透明,灰色和白色的1x1象素的图片已经包含在插件里面.
事件触发加载
事件可以是任何jQuery时间,如:click和mouseover.你还可以使用自定义的事件,如:sporty和foobar.默认情况下处于等待状态,直到用户滚动到窗口上图片所在位置.在灰色占位图片被点击之前阻止加载图片,你可以这样做:
$("img").lazyload({
placeholder:"img/grey.gif",
event:"click"
});使用特效
当图片完全加载的时候,插件默认地使用show()方法来将图显示出来.其实你可以使用任何你想用的特效来处理.下面的代码使用FadeIn效果.这是效果演示页面.
$("img.lazy").lazyload({
effect:"fadeIn"
});图片在容器里面
你可以将插件用在可滚动容器的图片上,例如带滚动条的DIV元素.你要做的只是将容器定义为jQuery对象并作为参数传到初始化方法里面.这是水平滚动演示页面和垂直滚动的演示页面.
#container{
height:600px;
overflow:scroll;
}
$("img.lazy").lazyload({
container:$("#container")
});当图片不顺序排列
滚动页面的时候,LazyLoad会循环为加载的图片.在循环中检测图片是否在可视区域内.默认情况下在找到第一张不在可见区域的图片时停止循环.图片被认为是流式分布的,图片在页面中的次序和HTML代码中次序相同.但是在一些布局中,这样的假设是不成立的.不过你可以通过failurelimit选项来控制加载行为.
$("img.lazy").lazyload({
failure_limit:10
});将failurelimit设为10令插件找到10个不在可见区域的图片是才停止搜索.如果你有一个猥琐的布局,请把这个参数设高一点.
延迟加载图片
LazyLoad插件的一个不完整的功能,但是这也能用来实现图片的延迟加载.下面的代码实现了页面加载完成后再加载.页面加载完成5秒后,指定区域内的图片会自动进行加载.这是延迟加载演示页面.
$(function(){
$("img:below-the-fold").lazyload({
event:"sporty"
});
});
$(window).bind("load",function(){
vartimeout=setTimeout(function(){$("img.lazy").trigger("sporty")},5000);
});加载隐藏的图片
可能在你的页面上埋藏可很多隐藏的图片.比如插件用在对列表的筛选,你可以不断地修改列表中各条目的显示状态.为了提升性能,LazyLoad默认忽略了隐藏图片.如果你想要加载隐藏图片,请将skip_invisible设为false
$("img.lazy").lazyload({
skip_invisible:false
});
希望本文所述对大家的javascript程序设计有所帮助。