學(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í)長(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í)有所幫助,也希望大家多多支持腳本之家。
- 理解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圖片懶加載的優(yōu)點(diǎn)及實(shí)現(xiàn)原理
這篇文章主要介紹了JS圖片懶加載的優(yōu)點(diǎn)及實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01關(guān)于layui表單中按鈕自動(dòng)提交的解決方法
今天小編就為大家分享一篇關(guān)于layui表單中按鈕自動(dòng)提交的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09微信小程序創(chuàng)建自定義全局函數(shù)以及其調(diào)用方法詳解
微信小程序有時(shí)需要函數(shù)里面調(diào)用函數(shù),下面這篇文章主要給大家介紹了關(guān)于微信小程序創(chuàng)建自定義全局函數(shù)以及其調(diào)用方法的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09解決頁面整體使用transform scale后高德地圖點(diǎn)位點(diǎn)擊偏移錯(cuò)位問題
這篇文章主要介紹了解決頁面整體使用transform scale后高德地圖點(diǎn)位點(diǎn)擊偏移錯(cuò)位問題的方法,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-01-01document.open() 與 document.write()的區(qū)別
document.open() 與 document.write()的區(qū)別...2007-08-08JavaScript實(shí)現(xiàn)N皇后問題算法謎題解答
這篇文章主要介紹了JavaScript實(shí)現(xiàn)N皇后問題算法謎題解答,N皇后問題是指將N個(gè)皇后放置在NxN的國際象棋棋盤上,其中沒有任何兩個(gè)皇后處于同一行、同一列或同一對(duì)角線上,以使得它們不能互相攻擊,需要的朋友可以參考下2014-12-12