学习JavaScript图片预加载模块


Posted in Javascript onNovember 07, 2016

前言

在一个应用中,通常会有很多图片,众所周知,加载图片需要时间,在图片没有加载出来之前,页面会是空白,为了提升用户体验,应用的开发人员使出浑身解数,其中最为常见的就是在图片没有加载完成之前,有一个加载动画。这里用到的技术主要是图片预加载。图片预加载的原理并不难,当给一个Image对象设置src属性后,图片就开始加载。给Image对象指定事件要位于设置src属性之前。

涉及到的内容

1.需要预加载的图片并不仅仅只是一张,通常将所有图片的信息保存在一个数组或者对象中,为了加载所有的图片,需要遍历出所有的图片。

2.当所有图片加载完后,又要接着执行其他的任务,这需要一个回调函数。

3.记录已经完成加载的图片数量,并实时的反应到页面上。

编码开始

注:html和css省略,主要讲解js文件

1.为了代码复用,我将图片预加载相关的代码封装在imageloader.js模块中,并暴露出一个接口。

2.入口文件是index.js,入口文件的代码如下:

var loadImage = require('./imageloader.js');
loadImage(['./img/rabbit-big.png','./img/face_slogan.png','./img/footer.png'],finish);
//finish是一个所以图片完成加载之后执行的回调函数
function finish(){
 document.body.innerHTML = '完成加载'
 }

3.imageloader.js模块代码入下:

'use strict';

/**
 * 预加载图片的函数
 * @param elem 显示加载进度的元素
 * @param images 加载图片的数组或者对象
 * @param callback 全部图片加载完毕后调用的回调函数
 * @param timeout 加载超时的时长
 */
function loadImage(elem,images,callback,timeout){
 //遍历出图片的计数器
 var count = 0;
 //默认全部图片都能成功加载
 var success = true;
 //超时timer的id
 var timerId = 0;
 //默认不会加载超时
 var isTimeout = false;
 //已经加载完成的长度
 var loaded = 0;

 //对图片数组(或对象)进行遍历
 for(var key in images){
 //过滤掉prototype上的属性
 if(!images.hasOwnProperty(key)){
 continue;
 }
 //获得每个图片元素
 //期望每个图片元素是一个object:{src:XXX}
 var item = images[key];
 if(typeof item === "string"){
 item = images[key] = {
 src:item
 }
 }
 //如果格式不满足期望,则进行下一次遍历
 if(!item || !item.src){
 continue;
 }
 //计算+1
 ++ count;
 //设置图片元素的id
 item.id = '__img__' + key + getId();
 //设置图片元素的image,它是一个image对象
 item.image = window[item.id] = new Image();

 doLoad(item);
 }
 //如果计数为0,则直接调用callback
 if(!count){
 callback(success);
 }else if(timeout){//如果设置了最长加载时间
 timerId = setTimeout(onTimeout,timeout)
 }
 /**
 * 真正进行图片预加载的函数
 * @param item 图片元素的对象
 */
 function doLoad(item){
 item.state = 'loading';

 var img = item.image;
 //图片加载成功的一个回调函数
 img.onload = function(){
 //只要有一张出现加载失败,success就会为false
 success = success & true;
 item.state = 'load';
 loaded ++;
 done();

 };
 //图片加载失败的回调函数
 img.onerror = function(){
 success = false;
 item.state = 'error';
 loaded ++;
 done();
 };
 //加载图片
 img.src = item.src;
 /**
 * 每张图片加载完成的回调函数,不论成功还是失败
 */
 function done(){
 //清除绑定的事件
 img.onload = null;
 img.onerror = null;
 try{
 delete window[item.id]
 }catch (e){

 }
 elem.innerHTML = '已加载' + (loaded / count * 100) + '%';
 //当所有图片加载完成并且没有超时的情况,清除定时器,且执行回调函数
 if(count === loaded && !isTimeout){
 clearTimeout(timerId);
 callback(success);
 }
 }
 }

 /**
 * 超时函数
 */
 function onTimeout(){
 isTimeout = true;
 success = false;
 callback(success);
 }

}

var __id = 0;
function getId(){
 return ++ __id;
}
module.exports = loadImage;

4.我使用的是webpack进行打包,如果你对打包还不熟悉,可以点击这儿学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
选择TreeView控件的树状数据节点的JS方法(jquery)
Feb 06 Javascript
18个非常棒的jQuery代码片段
Nov 02 Javascript
javascript实现九宫格相加数值相等
May 28 Javascript
探究JavaScript中的五种事件处理程序方式
Dec 07 Javascript
flexslider.js实现移动端轮播
Feb 05 Javascript
Vue计算属性的学习笔记
Mar 22 Javascript
vue+axios实现登录拦截的实例代码
May 22 Javascript
jQuery 表单序列化实例代码
Jun 11 jQuery
React Native 环境搭建的教程
Aug 19 Javascript
解决vue2.0动态绑定图片src属性值初始化时报错的问题
Mar 14 Javascript
JavaScript函数Call、Apply原理实例解析
Feb 17 Javascript
JS实现小米轮播图
Sep 21 Javascript
pc加载更多功能和移动端下拉刷新加载数据
Nov 07 #Javascript
jquery html5 视频播放控制代码
Nov 06 #Javascript
js无提示关闭浏览器窗口的两种方法分析
Nov 06 #Javascript
详解Angular.js的$q.defer()服务异步处理
Nov 06 #Javascript
Bootstrap 3.x打印预览背景色与文字显示异常的解决
Nov 06 #Javascript
d3.js实现简单的网络拓扑图实例代码
Nov 06 #Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
Nov 16 #Javascript
You might like
php判断ip黑名单程序代码实例
2014/02/24 PHP
php实现mysql备份恢复分卷处理的方法
2014/12/26 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
flash javascript之间的通讯方法小结
2008/12/20 Javascript
JavaScript 设计模式学习 Factory
2009/07/29 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
ext jquery 简单比较
2010/04/07 Javascript
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
jQuery封装animate.css的实例
2018/01/04 jQuery
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
webpack常用配置总览(小结)
2019/11/18 Javascript
Python访问纯真IP数据库脚本分享
2015/06/29 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
浅谈django三种缓存模式的使用及注意点
2018/09/30 Python
HTML5实现视频直播功能思路详解
2017/11/16 HTML / CSS
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
UGG澳洲官网:UGG Australia
2018/04/26 全球购物
Tessabit日本:集世界奢侈品和设计师品牌的意大利精品买手店
2020/01/07 全球购物
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
DataList 能否分页,请问如何实现?
2015/05/03 面试题
PHP引擎php.ini参数优化深入讲解
2021/03/24 PHP
计算机网络毕业生自荐信
2013/10/01 职场文书
饲料采购员岗位职责
2013/12/19 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
大学生入党自荐书
2015/03/05 职场文书
当幸福来敲门观后感
2015/06/01 职场文书
德能勤绩工作总结
2015/08/11 职场文书
Java常用工具类汇总 附示例代码
2021/06/26 Java/Android