時(shí)間:2022-05-29 08:03:01 | 來源:網(wǎng)絡(luò)營銷
時(shí)間:2022-05-29 08:03:01 來源:網(wǎng)絡(luò)營銷
網(wǎng)站開發(fā)時(shí)經(jīng)常需要在某個(gè)頁面需要實(shí)現(xiàn)對(duì)大量圖片的瀏覽,如果考慮流量的話,大可每個(gè)頁面只顯示一張圖片,讓用戶每看一張圖片就需要重新下載一下整個(gè)頁面。不過,在web2.0時(shí)代,更多人愿意用javascript來實(shí)現(xiàn)一個(gè)圖片瀏覽器,讓用戶無需等待過長的時(shí)間就能看到其他圖片。所以,對(duì)于一個(gè)網(wǎng)站來說,網(wǎng)頁的預(yù)加載就顯得尤為重要。在此,億企邦從網(wǎng)上找了3種預(yù)加載的代碼,就在億企邦上跟大家分享一下,共同分析一下:function preLoadImg(url) {通過調(diào)用preLoadImg函數(shù),傳入圖片的url,就能使圖片預(yù)先下載下來了。實(shí)際上,億企邦覺得這里用到的預(yù)下載功能也和這基本一致。圖片預(yù)下載下來后,通過img的width和height屬性,就能知道圖片的寬和高了。
var img = new Image();
img.src = url;
}
function loadImage(url, callback) {好了,再來寫一個(gè)測試用例:
var img = new Image();
img.src = url;
img.onload = function(){ //圖片下載完畢時(shí)異步調(diào)用callback函數(shù)。
callback.call(img); // 將callback函數(shù)this指針切換為img。
};
}
function imgLoaded(){在firefox中測試一下,發(fā)現(xiàn)不錯(cuò),果然和預(yù)想的效果一樣,在圖片下載后,就會(huì)彈出圖片的寬度來。無論點(diǎn)擊多少次或者刷新結(jié)果都一樣。
alert(this.width);
}
<input type="button" value="loadImage" onclick="loadImage('aaa.jpg',imgLoaded)"/>
function loadImage(url, callback) {經(jīng)過這么一番折騰,總算是讓各個(gè)瀏覽器都能滿足我們的目標(biāo)了。雖然代碼很簡單,但是卻把圖片瀏覽器中最核心的問題解決掉了,接下來你所要做的,僅僅是圖片如何呈現(xiàn)的問題了,當(dāng)然,也可以通過css來實(shí)現(xiàn)圖片的展示效果,具體可查看億企邦的《CSS無圖片技術(shù)的實(shí)現(xiàn)方法有哪些》,在此,我就不多說了。
var img = new Image(); //創(chuàng)建一個(gè)Image對(duì)象,實(shí)現(xiàn)圖片的預(yù)下載
img.src = url;
if (img.complete) { // 如果圖片已經(jīng)存在于瀏覽器緩存,直接調(diào)用回調(diào)函數(shù)
callback.call(img);
return; // 直接返回,不用再處理onload事件
}
img.onload = function () { //圖片下載完畢時(shí)異步調(diào)用callback函數(shù)。
callback.call(img);//將回調(diào)函數(shù)的this替換為Image對(duì)象
};
};
function loadImage(url, callback) {億企邦覺得這個(gè)方法功能是ok的,但是有一些隱患,具體如下:
var img = new Image(); //創(chuàng)建一個(gè)Image對(duì)象,實(shí)現(xiàn)圖片的預(yù)下載
img.src = url;
if (img.complete) { // 如果圖片已經(jīng)存在于瀏覽器緩存,直接調(diào)用回調(diào)函數(shù)
callback(img);
return; // 直接返回,不用再處理onload事件
}
img.onload = function () { //圖片下載完畢時(shí)異步調(diào)用callback函數(shù)。
callback(img);
};
};
img.onload = function () { //圖片下載完畢時(shí)異步調(diào)用callback函數(shù)。這樣既能解決內(nèi)存泄漏的問題,又能避免動(dòng)態(tài)圖片的事件多次觸發(fā)問題。
img.onload = null;
callback(img);
};
if (img.complete) { // 如果圖片已經(jīng)存在于瀏覽器緩存,直接調(diào)用回調(diào)函數(shù)關(guān)于這段代碼,億企邦覺得其原因如下:
callback(img);
return; // 直接返回,不用再處理onload事件
}
function loadImage(url, callback) {這樣內(nèi)存泄漏,動(dòng)態(tài)圖片的加載問題都得到了解決(關(guān)于圖片的優(yōu)化分類可查看億企邦的《網(wǎng)站圖片優(yōu)化的分類有哪些》相關(guān)介紹),而且也以統(tǒng)一的方式,實(shí)現(xiàn)了callback的調(diào)用。
var img = new Image(); //創(chuàng)建一個(gè)Image對(duì)象,實(shí)現(xiàn)圖片的預(yù)下載
img.onload = function(){
img.onload = null;
callback(img);
}
img.src = url;
}
var imgLoad = function (url, callback) {從以上代碼,我們可以看到上面必須等待圖片加載完畢才能獲取尺寸,其速度億企邦還真不敢恭維,對(duì)此,我們需要改進(jìn)。
var img = new Image();
img.src = url;
if (img.complete) {
callback(img.width, img.height);
} else {
img.onload = function () {
callback(img.width, img.height);
img.onload = null;
};
};
};
// 更新:調(diào)用例子:
// 05.27: 1、保證回調(diào)執(zhí)行順序:error > ready > load;2、回調(diào)函數(shù)this指向img本身
// 04-02: 1、增加圖片完全加載后的回調(diào) 2、提高性能
/**
* 圖片頭數(shù)據(jù)加載就緒事件 - 更快獲取圖片尺寸
* @version 2011.05.27
* @author TangBin
* @seehttp://www.mahaixiang.cn/wyzz/546.html
* @param {String} 圖片路徑
* @param {Function} 尺寸就緒
* @param {Function} 加載完畢 (可選)
* @param {Function} 加載錯(cuò)誤 (可選)
* @example imgReady('http://www.mahaixiang.cn/uploads/allimg/1405/1-14050212013ML.jpg', function () {
alert('size ready: width=' + this.width + '; height=' + this.height);
});
*/
var imgReady = (function () {
var list = [], intervalId = null,
// 用來執(zhí)行隊(duì)列
tick = function () {
var i = 0;
for (; i < list.length; i++) {
list[i].end ? list.splice(i--, 1) : list[i]();
};
!list.length && stop();
},
// 停止所有定時(shí)器隊(duì)列
stop = function () {
clearInterval(intervalId);
intervalId = null;
};
return function (url, ready, load, error) {
var onready, width, height, newWidth, newHeight,
img = new Image();
img.src = url;
// 如果圖片被緩存,則直接返回緩存數(shù)據(jù)
if (img.complete) {
ready.call(img);
load && load.call(img);
return;
};
width = img.width;
height = img.height;
// 加載錯(cuò)誤后的事件
img.onerror = function () {
error && error.call(img);
onready.end = true;
img = img.onload = img.onerror = null;
};
// 圖片尺寸就緒
onready = function () {
newWidth = img.width;
newHeight = img.height;
if (newWidth !== width || newHeight !== height ||
// 如果圖片已經(jīng)在其他地方加載可使用面積檢測
newWidth * newHeight > 1024
) {
ready.call(img);
onready.end = true;
};
};
onready();
// 完全加載完畢的事件
img.onload = function () {
// onload在定時(shí)器時(shí)間差范圍內(nèi)可能比onready快
// 這里進(jìn)行檢查并保證onready優(yōu)先執(zhí)行
!onready.end && onready();
load && load.call(img);
// IE gif動(dòng)畫會(huì)循環(huán)執(zhí)行onload,置空onload即可
img = img.onload = img.onerror = null;
};
// 加入隊(duì)列中定期執(zhí)行
if (!onready.end) {
list.push(onready);
// 無論何時(shí)只允許出現(xiàn)一個(gè)定時(shí)器,減少瀏覽器性能損耗
if (intervalId === null) intervalId = setInterval(tick, 40);
};
};
})();
imgReady('http://www.google.com.hk/intl/zh-CN/images/logo_cn.png', function () {是不是很簡單?這樣的方式獲取攝影級(jí)別照片尺寸的速度往往是onload方式的幾十多倍,而對(duì)于web普通(800×600內(nèi))瀏覽級(jí)別的圖片能達(dá)到秒殺效果。看了這個(gè)再回憶一下你見過的web相冊(cè),是否絕大部分都可以重構(gòu)一下的。
alert('size ready: width=' + this.width + '; height=' + this.height);
});
關(guān)鍵詞:效果,技術(shù),方法
客戶&案例
營銷資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2022 保留一切法律許可權(quán)利。