学习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 相关文章推荐
JQuery实现表格动态增加行并对新行添加事件
Jul 30 Javascript
简单谈谈javascript中的变量、作用域和内存问题
Aug 30 Javascript
JavaScript学习笔记之数组随机排序
Mar 23 Javascript
使用jquery提交form表单并自定义action的实现代码
May 25 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
Aug 04 Javascript
js实现简易垂直滚动条
Feb 22 Javascript
vue.js的提示组件
Mar 02 Javascript
JavaScript"模拟事件"的注意要点详解
Feb 13 Javascript
小程序中的箭头函数的具体使用
Jun 19 Javascript
uin-app+mockjs实现本地数据模拟
Aug 26 Javascript
js实现简易ATM功能
Oct 27 Javascript
Element实现动态表格的示例代码
Aug 02 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使用异或实现的加密解密实例
2013/09/04 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
php array_multisort 对数组进行排序详解及实例代码
2016/10/27 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
JS获取url链接字符串 location.href
2013/12/23 Javascript
jQuery实现多按钮单击变色
2014/11/27 Javascript
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
js实现内容显示并使用json传输数据
2016/03/16 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
Jquery调用iframe父页面中的元素及方法
2016/08/23 Javascript
bootstrap栅格系统示例代码分享
2017/05/22 Javascript
jQuery选择器_动力节点Java学院整理
2017/07/05 jQuery
vue按需加载组件webpack require.ensure的方法
2017/12/13 Javascript
python连接mysql调用存储过程示例
2014/03/05 Python
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
使用wxPython获取系统剪贴板中的数据的教程
2015/05/06 Python
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
用Python实现筛选文件脚本的方法
2018/10/27 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
Numpy之random函数使用学习
2019/01/29 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
利用python Selenium实现自动登陆京东签到领金币功能
2019/10/31 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
Python 操作 MySQL数据库
2020/09/18 Python
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
Yahoo-PHP面试题3
2012/01/14 面试题
财务部经理岗位职责
2014/02/03 职场文书
个人整改措施书面材料
2014/10/24 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
Nginx配置https原理及实现过程详解
2021/03/31 Servers
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL