學(xué)習(xí)JavaScript圖片預(yù)加載模塊
前言
在一個(gè)應(yīng)用中,通常會(huì)有很多圖片,眾所周知,加載圖片需要時(shí)間,在圖片沒有加載出來之前,頁面會(huì)是空白,為了提升用戶體驗(yàn),應(yīng)用的開發(fā)人員使出渾身解數(shù),其中最為常見的就是在圖片沒有加載完成之前,有一個(gè)加載動(dòng)畫。這里用到的技術(shù)主要是圖片預(yù)加載。圖片預(yù)加載的原理并不難,當(dāng)給一個(gè)Image對(duì)象設(shè)置src屬性后,圖片就開始加載。給Image對(duì)象指定事件要位于設(shè)置src屬性之前。
涉及到的內(nèi)容
1.需要預(yù)加載的圖片并不僅僅只是一張,通常將所有圖片的信息保存在一個(gè)數(shù)組或者對(duì)象中,為了加載所有的圖片,需要遍歷出所有的圖片。
2.當(dāng)所有圖片加載完后,又要接著執(zhí)行其他的任務(wù),這需要一個(gè)回調(diào)函數(shù)。
3.記錄已經(jīng)完成加載的圖片數(shù)量,并實(shí)時(shí)的反應(yīng)到頁面上。
編碼開始
注:html和css省略,主要講解js文件
1.為了代碼復(fù)用,我將圖片預(yù)加載相關(guān)的代碼封裝在imageloader.js模塊中,并暴露出一個(gè)接口。
2.入口文件是index.js,入口文件的代碼如下:
var loadImage = require('./imageloader.js');
loadImage(['./img/rabbit-big.png','./img/face_slogan.png','./img/footer.png'],finish);
//finish是一個(gè)所以圖片完成加載之后執(zhí)行的回調(diào)函數(shù)
function finish(){
document.body.innerHTML = '完成加載'
}
3.imageloader.js模塊代碼入下:
'use strict';
/**
* 預(yù)加載圖片的函數(shù)
* @param elem 顯示加載進(jìn)度的元素
* @param images 加載圖片的數(shù)組或者對(duì)象
* @param callback 全部圖片加載完畢后調(diào)用的回調(diào)函數(shù)
* @param timeout 加載超時(shí)的時(shí)長
*/
function loadImage(elem,images,callback,timeout){
//遍歷出圖片的計(jì)數(shù)器
var count = 0;
//默認(rèn)全部圖片都能成功加載
var success = true;
//超時(shí)timer的id
var timerId = 0;
//默認(rèn)不會(huì)加載超時(shí)
var isTimeout = false;
//已經(jīng)加載完成的長度
var loaded = 0;
//對(duì)圖片數(shù)組(或?qū)ο螅┻M(jìn)行遍歷
for(var key in images){
//過濾掉prototype上的屬性
if(!images.hasOwnProperty(key)){
continue;
}
//獲得每個(gè)圖片元素
//期望每個(gè)圖片元素是一個(gè)object:{src:XXX}
var item = images[key];
if(typeof item === "string"){
item = images[key] = {
src:item
}
}
//如果格式不滿足期望,則進(jìn)行下一次遍歷
if(!item || !item.src){
continue;
}
//計(jì)算+1
++ count;
//設(shè)置圖片元素的id
item.id = '__img__' + key + getId();
//設(shè)置圖片元素的image,它是一個(gè)image對(duì)象
item.image = window[item.id] = new Image();
doLoad(item);
}
//如果計(jì)數(shù)為0,則直接調(diào)用callback
if(!count){
callback(success);
}else if(timeout){//如果設(shè)置了最長加載時(shí)間
timerId = setTimeout(onTimeout,timeout)
}
/**
* 真正進(jìn)行圖片預(yù)加載的函數(shù)
* @param item 圖片元素的對(duì)象
*/
function doLoad(item){
item.state = 'loading';
var img = item.image;
//圖片加載成功的一個(gè)回調(diào)函數(shù)
img.onload = function(){
//只要有一張出現(xiàn)加載失敗,success就會(huì)為false
success = success & true;
item.state = 'load';
loaded ++;
done();
};
//圖片加載失敗的回調(diào)函數(shù)
img.onerror = function(){
success = false;
item.state = 'error';
loaded ++;
done();
};
//加載圖片
img.src = item.src;
/**
* 每張圖片加載完成的回調(diào)函數(shù),不論成功還是失敗
*/
function done(){
//清除綁定的事件
img.onload = null;
img.onerror = null;
try{
delete window[item.id]
}catch (e){
}
elem.innerHTML = '已加載' + (loaded / count * 100) + '%';
//當(dāng)所有圖片加載完成并且沒有超時(shí)的情況,清除定時(shí)器,且執(zhí)行回調(diào)函數(shù)
if(count === loaded && !isTimeout){
clearTimeout(timerId);
callback(success);
}
}
}
/**
* 超時(shí)函數(shù)
*/
function onTimeout(){
isTimeout = true;
success = false;
callback(success);
}
}
var __id = 0;
function getId(){
return ++ __id;
}
module.exports = loadImage;
4.我使用的是webpack進(jìn)行打包,如果你對(duì)打包還不熟悉,可以點(diǎn)擊這兒學(xué)習(xí)。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 理解Javascript圖片預(yù)加載
- 多種js圖片預(yù)加載實(shí)現(xiàn)方式分享
- 基于javascript實(shí)現(xiàn)圖片預(yù)加載
- JS實(shí)現(xiàn)圖片預(yù)加載無需等待
- js 實(shí)現(xiàn)圖片預(yù)加載(js操作 Image對(duì)象屬性complete ,事件onload 異步加載圖片)
- javascript預(yù)加載圖片、css、js的方法示例介紹
- 純JS圖片批量預(yù)加載技術(shù)代碼
- js 利用image對(duì)象實(shí)現(xiàn)圖片的預(yù)加載提高訪問速度
- javascript 也來玩玩圖片預(yù)加載
- 利用CSS、JavaScript及Ajax實(shí)現(xiàn)高效的圖片預(yù)加載
相關(guān)文章
JS實(shí)現(xiàn)瀏覽器狀態(tài)欄文字閃爍效果的方法
這篇文章主要介紹了JS實(shí)現(xiàn)瀏覽器狀態(tài)欄文字閃爍效果的方法,通過時(shí)間函數(shù)定時(shí)觸發(fā)遞歸調(diào)用實(shí)現(xiàn)狀態(tài)欄文字閃爍效果,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
javascript contains和compareDocumentPosition 方法來確定是否HTML節(jié)點(diǎn)間的關(guān)
一個(gè)很棒的 blog 文章,是 PPK 兩年前寫的,文章中解釋了 contains() 和 compareDocumentPosition() 方法運(yùn)行在他們各自的瀏覽器上。2010-02-02
Javascript中浮點(diǎn)數(shù)相乘的一個(gè)解決方法
這篇文章主要介紹了Javascript中浮點(diǎn)數(shù)相乘的一個(gè)解決方法,需要的朋友可以參考下2014-06-06
JavaScript使用指針操作實(shí)現(xiàn)約瑟夫問題實(shí)例
這篇文章主要介紹了JavaScript使用指針操作實(shí)現(xiàn)約瑟夫問題,實(shí)例分析了javascript模擬數(shù)組指針操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
JavaScript實(shí)現(xiàn)下載base64數(shù)據(jù)并兼容低版本
這篇文章主要為大家詳細(xì)介紹了如何使用JavaScript實(shí)現(xiàn)下載base64數(shù)據(jù)并兼容低版本,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12
JS類中定義原型方法的兩種實(shí)現(xiàn)的區(qū)別
JS類中定義原型方法的兩種實(shí)現(xiàn)的區(qū)別...2007-03-03
JavaScript實(shí)現(xiàn)動(dòng)態(tài)刪除列表框值的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)動(dòng)態(tài)刪除列表框值的方法,涉及javascript針對(duì)select列表框的遍歷與刪除操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
JavaScript面向?qū)ο笾叽蠡驹瓌t實(shí)例詳解
這篇文章主要介紹了JavaScript面向?qū)ο笾叽蠡驹瓌t,結(jié)合實(shí)例形式詳細(xì)分析了JavaScript面向?qū)ο笃叽蠡驹瓌t,包括單一職責(zé)、開閉原則、里氏替換、依賴倒置、接口隔離、迪米特法則及組合/聚合復(fù)用原則,需要的朋友可以參考下2020-05-05
SlideView 圖片滑動(dòng)(擴(kuò)展/收縮)展示效果
滑動(dòng)展示效果主要用在圖片或信息的滑動(dòng)展示,也可以設(shè)置一下做成簡(jiǎn)單的口風(fēng)琴(Accordion)效果。2010-08-08

