本文實例講述了Jquery實作圖片預先載入與延時載入的方法。分享給大家供大家參考。具體分析如下:
有很多項目經常會需要判斷圖片加載完成後執行相應的操作,或者需要圖片延遲加載,網上雖然已經有很不錯的插件,但要為這些效果還得單獨加載一個插件的話總感覺有點不舒服,乾脆自己寫了個方法:
複製程式碼
程式碼如下:
function loadimg(arr,funLoading,funOnLoad,funOnErrorad,funOnError){
numError=0,
isObject=Object.prototype.toString.call(arr)==="[object Object]" ? true : false;
var arr=isObject ? arr.get() : arr;
for(a in arr){
var src=isObject ? $(arr[a]).attr("data-src") : arr[a];
preload(src,arr[a]);
}
function preload(src,obj){
var img=new Image();
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:單一圖片載入出錯時的操作。
程式碼如下:
var imgonload=function(errors){
/*errors:載入出錯的圖片數量;*/
console.log("loaded," errors " images loaded error!");
}
var funloading=function(n,total,src,obj){
/*
n:已載入完成的數量;
total:總共需要載入的圖片數量;
src:目前載入完成的圖片路徑;
obj:當loadimg函數中傳入的arr為存放圖片路徑的陣列時,obj=src,是圖片路徑,
當arr為jquery物件時,obj是目前已載入完成的img dom物件。
*/
console.log(n "of" total " pic loaded.",src);
var newimg = document.createElement("img");
newimg.src=src;
$("body").append(newimg).fadeIn();
}
var funloading_obj=function(n,total,src,obj){
console.log(n "of" total " pic loaded.",src);
$(obj).attr("src",src);
$(obj).fadeIn(200);
}
var funOnError=function(n,total,src,obj){
console.log("the " n "st img loaded Error!");
}
程式碼如下:
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);*/
上面算是原生態寫法了,下面我們介紹一個基於Lazy Load, 延遲載入圖片的 jQuery 外掛程式
Lazy Load 依賴 jQuery. 請將下列程式碼加入頁面 head 區域:
複製程式碼
程式碼如下:
你必須修改HTML 代碼. 在src 屬性中設定展位符圖片, demo 頁面使用1x1 像素灰色GIF 圖片. 並且需要將真實圖片的URL 設置到data-original 屬性. 這裡可以定義特定的class 以獲得需要延遲加載的圖片物件. 透過這種方法你可以簡單地控制插件綁定.
處理圖片的程式碼如下.
$("img.lazy").lazyload();
這將使所有 class 為 lazy 的圖片將被延遲加載. 可以參考基本選項 demo
設定敏感度
幾乎所有瀏覽器的JavaScript 都是啟動的. 然而可能你仍希望能在不支援JavaScript 的客戶端展示真實圖片. 當瀏覽器不支援JavaScript 時優雅降級, 你可以將真實的圖片片段在寫
這些都是可選的, 但如果你希望插件平穩降級這些都是應該做的.
設定敏感度
預設圖片會出現在螢幕時載入. 如果你想提前載入圖片, 可以設定 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")
});
當圖片不順序排列
滾動頁面的時候, Lazy Load 會循環為加載的圖片. 在循環中檢測圖片是否在可視區域內. 默認情況下在找到第一張不在可見區域的圖片時停止循環. 圖片被認為是流式分佈的, 圖片在頁面中的次序和HTML 代碼中次序相同. 但是在一些佈局中, 這樣的假設是不成立的. 不過你可以通過failurelimit 選項來控制加載行為.
$("img.lazy").lazyload({
failure_limit : 10
});
將 failurelimit 設為 10 令插件找到 10 個不在可見區域的圖片是才停止搜尋. 如果你有一個猥瑣的佈局, 請把這個參數設高一點.
延遲載入圖片
Lazy Load 插件的一個不完整的功能, 但是這也能用來實現圖片的延遲加載. 下面的代碼實現了頁面加載完成後再加載. 頁面加載完成5 秒後, 指定區域內的圖片會自動進行載入. 這是延遲載入示範頁面.
$(function() {
$("img:below-the-fold").lazyload({
event : "sporty"
});
});
$(window).bind("load", function() {
var timeout = setTimeout(function() {$("img.lazy").trigger("sporty")}, 5000);
});
載入隱藏的圖片
可能在你的頁面上埋藏可很多隱藏的圖片. 例如插件用在對列表的篩選, 你可以不斷地修改列表中各條目的顯示狀態. 為了提升性能, Lazy Load 默認忽略了隱藏圖片.如果你想要載入隱藏圖片, 請將skip_invisible 設為false
$("img.lazy").lazyload({
skip_invisible : false
});
希望本文所述對大家的javascript程式設計有所幫助。