解析javascript圖片懶加載與預(yù)加載的分析總結(jié)
本篇文章主要介紹了懶加載和預(yù)加載兩種技術(shù)的解析,廢話不多說,一起來看吧。
懶加載也叫延遲加載:前一篇文章有介紹:JS圖片延遲加載 延遲加載圖片或符合某些條件時(shí)才加載某些圖片。
預(yù)加載:提前加載圖片,當(dāng)用戶需要查看時(shí)可直接從本地緩存中渲染。
兩種技術(shù)的本質(zhì):兩者的行為是相反的,一個是提前加載,一個是遲緩甚至不加載。懶加載對服務(wù)器前端有一定的緩解壓力作用,預(yù)加載則會增加服務(wù)器前端壓力。
懶加載的意義及實(shí)現(xiàn)方式有:
意義: 懶加載的主要目的是作為服務(wù)器前端的優(yōu)化,減少請求數(shù)或延遲請求數(shù)。
實(shí)現(xiàn)方式:
1.第一種是純粹的延遲加載,使用setTimeOut或setInterval進(jìn)行加載延遲.
2.第二種是條件加載,符合某些條件,或觸發(fā)了某些事件才開始異步下載。
3.第三種是可視區(qū)加載,即僅加載用戶可以看到的區(qū)域,這個主要由監(jiān)控滾動條來實(shí)現(xiàn),一般會在距用戶看到某圖片前一定距離遍開始加載,這樣能保證用戶拉下時(shí)正好能看到圖片。
預(yù)加載的意義及實(shí)現(xiàn)方式有:
預(yù)加載可以說是犧牲服務(wù)器前端性能,換取更好的用戶體驗(yàn),這樣可以使用戶的操作得到最快的反映。實(shí)現(xiàn)預(yù)載的方法非常多,可以用CSS(background)、JS(Image)、HTML(<img />)都可以。常用的是new Image();,設(shè)置其src來實(shí)現(xiàn)預(yù)載,再使用onload方法回調(diào)預(yù)載完成事件。只要瀏覽器把圖片下載到本地,同樣的src就會使用緩存,這是最基本也是最實(shí)用的預(yù)載方法。當(dāng)Image下載完圖片頭后,會得到寬和高,因此可以在預(yù)載前得到圖片的大小(方法是用記時(shí)器輪循寬高變化)。
怎么樣才能實(shí)現(xiàn)預(yù)加載?
我們可以通過google一搜索:可以看到很多人用這種方式進(jìn)行預(yù)加載:代碼如下:
function loadImage(url,callback) {
var img = new Image();
img.src = url;
img.onload = function(){
img.onload = null;
callback.call(img);
}
}
為什么其他瀏覽器正常的:其實(shí)原因很簡單,就是瀏覽器緩存了,除了IE6以外(即說opera也會,但是我特意用opera試了下,沒有,可能版本的問題吧,或許現(xiàn)在已經(jīng)修復(fù)了。),其他瀏覽器重新點(diǎn)擊會再次執(zhí)行onload方法,但是IE6是直接從瀏覽器取的。
那現(xiàn)在怎么辦?最好的情況是Image可以有一個狀態(tài)值表明它是否已經(jīng)載入成功了。從緩存加載的時(shí)候,因?yàn)椴恍枰却?,這個狀態(tài)值就直接是表明已經(jīng)下載了,而從http請求加載時(shí),因?yàn)樾枰却螺d,這個值顯示為未完成。這樣的話,就可以搞定了。經(jīng)過google搜索下即介紹:發(fā)現(xiàn)有一個為各個瀏覽器所兼容的Image的屬性——complete。所以,在圖片onload事件之前先對這個值做一下判斷即可。最后,代碼變成如下的樣子:
function loadImage(url,callback) {
var img = new Image();
img.src = url;
if(img.complete) { // 如果圖片已經(jīng)存在于瀏覽器緩存,直接調(diào)用回調(diào)函數(shù)
callback.call(img);
return; // 直接返回,不用再處理onload事件
}
img.onload = function(){
img.onload = null;
callback.call(img);
}
}
也就是說如果圖片已經(jīng)在瀏覽器緩存里面 那么支持直接從瀏覽器緩存取得直接執(zhí)行img.complete里面的函數(shù) 接著返回.
但是我們可以看到上面的代碼:必須等圖片加載完成后,可以執(zhí)行回調(diào)函數(shù),也可以說等圖片加載后,我們可以獲取圖片的寬度和高度。那么如果我們想提前獲取圖片的尺寸那怎么辦?上網(wǎng)經(jīng)驗(yàn)告訴我:瀏覽器在加載圖片的時(shí)候你會看到圖片會先占用一塊地然后才慢慢加載完畢,并且不需要預(yù)設(shè)width與height屬性,因?yàn)闉g覽器能夠獲取圖片的頭部數(shù)據(jù)?;诖耍恍枰褂胘avascript定時(shí)偵測圖片的尺寸狀態(tài)便可得知圖片尺寸就緒的狀態(tài)。代碼如下:(但是有個前提是 這個方式不是我想的,也不是我寫的代碼,是網(wǎng)上朋友總結(jié)的代碼 我只是知道有這么一個原理)
var imgReady = (function(){
var list = [],
intervalId = null;
// 用來執(zhí)行隊(duì)列
var queue = function(){
for(var i = 0; i < list.length; i++){
list[i].end ? list.splice(i--,1) : list[i]();
}
!list.length && stop();
};
// 停止所有定時(shí)器隊(duì)列
var stop = function(){
clearInterval(intervalId);
intervalId = null;
}
return function(url, ready, error) {
var onready = {},
width,
height,
newWidth,
newHeight,
img = new Image();
img.src = url;
// 如果圖片被緩存,則直接返回緩存數(shù)據(jù)
if(img.complete) {
ready.call(img);
return;
}
width = img.width;
height = img.height;
// 加載錯誤后的事件
img.onerror = function () {
error && error.call(img);
onready.end = true;
img = img.onload = img.onerror = null;
};
// 圖片尺寸就緒
var 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();
// IE gif動畫會循環(huán)執(zhí)行onload,置空onload即可
img = img.onload = img.onerror = null;
};
// 加入隊(duì)列中定期執(zhí)行
if (!onready.end) {
list.push(onready);
// 無論何時(shí)只允許出現(xiàn)一個定時(shí)器,減少瀏覽器性能損耗
if (intervalId === null) {
intervalId = setInterval(queue, 40);
};
};
}
})();
調(diào)用方式如下:
imgReady('http://img01.taobaocdn.com/imgextra/i1/397746073/T2BDE8Xb0bXXXXXXXX-397746073.jpg',function(){
alert('width:' + this.width + 'height:' + this.height);
});
以上就是本文的全部內(nèi)容,希望本文所述對你有所幫助,希望大家繼續(xù)關(guān)注我們的網(wǎng)站!想要學(xué)習(xí)jsp可以繼續(xù)關(guān)注本站。
相關(guān)文章
javascript合并兩個數(shù)組最簡單的實(shí)現(xiàn)方法
這篇文章主要介紹了javascript合并兩個數(shù)組最簡單的實(shí)現(xiàn)方法,方法很簡單,有需要的朋友們可以學(xué)習(xí)下。2019-09-09
JS實(shí)現(xiàn)網(wǎng)頁背景顏色與select框中顏色同時(shí)變化的方法
這篇文章主要介紹了JS實(shí)現(xiàn)網(wǎng)頁背景顏色與select框中顏色同時(shí)變化的方法,實(shí)例分析了javascript操作select及css樣式的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02
深入剖析JavaScript中Geolocation?API的使用
這篇文章主要來和大家一起深入探討?JavaScript?的?Geolocation?API,看看它的強(qiáng)大之處以及如何在你的項(xiàng)目中應(yīng)用它,感興趣的可以了解下2024-03-03
基于JS實(shí)現(xiàn)計(jì)算24點(diǎn)算法代碼實(shí)例解析
這篇文章主要介紹了基于JS實(shí)現(xiàn)計(jì)算24點(diǎn)算法代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
layui自己添加圖片按鈕并點(diǎn)擊跳轉(zhuǎn)頁面的例子
今天小編就為大家分享一篇layui自己添加圖片按鈕并點(diǎn)擊跳轉(zhuǎn)頁面的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
前端技巧之HTTP中POST提交數(shù)據(jù)四種方式
這篇文章主要為大家介紹了前端技巧之HTTP中POST提交數(shù)據(jù)四種方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06

