学习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 相关文章推荐
详解js闭包
Sep 02 Javascript
jQuery实现长按按钮触发事件的方法
Feb 02 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
Nov 30 Javascript
浅析2种JavaScript继承方式
Dec 04 Javascript
Node.js实现JS文件合并小工具
Feb 02 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
May 24 Javascript
javascript动画之模拟拖拽效果篇
Sep 26 Javascript
vue实现动态数据绑定
Apr 28 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
Dec 07 Javascript
angular2路由之routerLinkActive指令【推荐】
May 30 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
Nov 08 Javascript
Vue 的 v-model用法实例
Nov 23 Vue.js
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原生模板引擎 最简单的模板引擎
2012/04/25 PHP
使用纯php代码实现页面伪静态的方法
2015/07/25 PHP
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
ThinkPHP 模板substr的截取字符串函数详解
2017/01/09 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
2019/10/15 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
基于JavaScript 类的使用详解
2013/05/07 Javascript
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
2014/08/30 Javascript
Node.js 异步编程之 Callback介绍(一)
2015/03/30 Javascript
JS百度地图搜索悬浮窗功能
2017/01/12 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
js的OOP继承实现(必看篇)
2017/02/18 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
this在vue和小程序中的使用详解
2019/01/28 Javascript
vue简单练习 桌面时钟的实现代码实例
2019/09/19 Javascript
Python获取linux主机ip的简单实现方法
2016/04/18 Python
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
浅谈scrapy 的基本命令介绍
2017/06/13 Python
python实现分页效果
2017/10/25 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
Python 绘图库 Matplotlib 入门教程
2018/04/19 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
2019/01/23 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
tensorflow 保存模型和取出中间权重例子
2020/01/24 Python
pycharm全局搜索的具体步骤
2020/07/28 Python
Pycharm 跳转回之前所在页面的操作
2021/02/05 Python
集团公司党的群众路线教育实践活动工作总结
2014/03/03 职场文书
校园活动宣传方案
2014/03/28 职场文书
大二学年个人总结
2015/03/03 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
详解MySQL 用户权限管理
2021/04/20 MySQL
MySQL中的引号和反引号的区别与用法详解
2021/10/24 MySQL