欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

學(xué)習(xí)JavaScript圖片預(yù)加載模塊

 更新時(shí)間:2016年11月07日 08:40:37   作者:QxQstar  
這篇文章主要介紹了js實(shí)現(xiàn)圖片預(yù)加載的方法,內(nèi)容很詳細(xì),帶領(lǐng)大家全面認(rèn)識(shí)js圖片預(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í)長(zhǎng)
 */
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)加載完成的長(zhǎ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è)置了最長(zhǎng)加載時(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í)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論