学习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 italics方法入门实例(把字符串显示为斜体)
Oct 17 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
Mar 05 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
Nov 02 Javascript
Bootstrap3 模态框使用实例
Feb 22 Javascript
Bootstrap实现各种进度条样式详解
Apr 13 Javascript
原生JS+Canvas实现五子棋游戏实例
Jun 19 Javascript
js简单的分页器插件代码实例
Sep 11 Javascript
JavaScript canvas实现跟随鼠标事件
Feb 10 Javascript
vue-socket.io跨域问题有效解决方法
Feb 11 Javascript
微信小程序拖拽排序列表的示例代码
Jul 08 Javascript
vue 弹出遮罩层样式实例
Jul 22 Javascript
Node.js fs模块原理及常见用途
Oct 22 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.ini中date.timezone设置分析
2011/07/29 PHP
无需数据库在线投票调查php代码
2016/07/20 PHP
php微信公众号开发模式详解
2016/11/28 PHP
网页javascript精华代码集
2007/01/24 Javascript
Javascript中的数学函数集合
2007/05/08 Javascript
JavaScript对象、属性、事件手册集合方便查询
2010/07/04 Javascript
Js,alert出现乱码问题的解决方法
2013/06/19 Javascript
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
JS 获取鼠标左右键的键值方法
2014/10/11 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
Windows下快速搭建NodeJS本地服务器的步骤
2017/08/09 NodeJs
BootStrap实现文件上传并带有进度条效果
2017/09/11 Javascript
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
[01:02:06]LGD vs Mineski Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
Python中使用不同编码读写txt文件详解
2015/05/28 Python
python中的字典操作及字典函数
2018/01/03 Python
Pycharm简单使用教程(入门小结)
2019/07/04 Python
python的json中方法及jsonpath模块用法分析
2019/12/06 Python
python 字段拆分详解
2019/12/17 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
django中cookiecutter的使用教程
2020/12/03 Python
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
教师三严三实对照检查材料
2014/09/25 职场文书
开幕式邀请函
2015/01/31 职场文书
工会积极分子个人总结
2015/03/03 职场文书
请学会珍惜眼前,因为人生没有下辈子!
2019/11/12 职场文书
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python
frg-100简单操作(设置)说明
2022/04/05 无线电
nginx静态资源的服务器配置方法
2022/07/07 Servers