学习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 相关文章推荐
javascript下查找父节点的简单方法
Aug 13 Javascript
一个挺有意思的Javascript小问题说明
Sep 26 Javascript
在AngularJS应用中实现一些动画效果的代码
Jun 18 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
Jul 27 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
Jan 01 Javascript
JavaScript的模块化开发框架Sea.js上手指南
May 12 Javascript
AngularJS中比较两个数组是否相同
Aug 24 Javascript
详解数组Array.sort()排序的方法
May 09 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
Sep 18 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
Sep 30 Javascript
JS随机密码生成算法
Sep 23 Javascript
React + Threejs + Swiper 实现全景图效果的完整代码
Jun 28 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绘制一条直线的方法
2015/01/24 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
2016/05/11 PHP
PHP实现的自定义数组排序函数与排序类示例
2016/11/18 PHP
PHP PDOStatement::getColumnMeta讲解
2019/02/01 PHP
js下用层来实现select的title提示属性
2010/02/23 Javascript
Jquery Change与bind事件代码
2011/09/29 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
javascript中typeof操作符和constucor属性检测
2015/02/26 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
2015/03/24 Javascript
如何使用HTML5地理位置定位功能
2015/04/27 Javascript
学习JavaScript设计模式(单例模式)
2015/11/26 Javascript
BootStrap glyphicons 字体图标实现方法
2016/05/01 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
2018/03/01 Javascript
详解vue中的computed的this指向问题
2018/12/05 Javascript
element-ui 中使用upload多文件上传只请求一次接口
2019/07/19 Javascript
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
python3 打开外部程序及关闭的示例
2018/11/06 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
CSS3属性box-shadow使用详细教程
2012/01/21 HTML / CSS
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
创业计划书撰写原则
2014/01/25 职场文书
《口技》教学反思
2014/02/21 职场文书
社区党务公开实施方案
2014/03/18 职场文书
3分钟英语演讲稿
2014/04/29 职场文书
上课不认真检讨书
2014/09/17 职场文书
党员评议思想汇报
2014/10/08 职场文书
经典法律座右铭(50句)
2019/08/15 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python
Node与Python 双向通信的实现代码
2021/07/16 Javascript
Python的property属性详细讲解
2022/04/11 Python
Python使用华为API为图像设置多个锚点标签
2022/04/12 Python