学习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 相关文章推荐
HTA版JSMin(省略修饰语若干)基于javascript语言编写
Dec 24 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
Oct 11 Javascript
实现局部遮罩与关闭原理及代码
Feb 04 Javascript
js 日期比较相关天数代码
Apr 02 Javascript
IE6兼容透明背景图片及解决方案
Aug 19 Javascript
使用node+vue.js实现SPA应用
Jan 28 Javascript
JavaScript禁止复制与粘贴的实现代码
May 16 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
May 25 Javascript
基于JavaScript实现点击页面任何位置返回
Aug 31 Javascript
webpack踩坑之路图片的路径与打包
Sep 05 Javascript
vue之debounce属性被移除及处理详解
Nov 13 Javascript
OpenLayers3实现鼠标移动显示坐标
Sep 25 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结合ajax实现赞、顶、踩功能实例
2014/05/12 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
2014/07/14 PHP
ThinkPHP中I(),U(),$this->post()等函数用法
2014/11/22 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
PHP语法小结之基础和变量
2015/11/22 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
JavaScript 和 Java 的区别浅析
2013/07/31 Javascript
写得不错的jquery table鼠标经过变色代码
2013/09/27 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
谷歌Chrome浏览器扩展程序开发小记
2016/01/06 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
2017/09/19 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
JS无限级导航菜单实现方法
2019/01/05 Javascript
详解Vue调用手机相机和相册以及上传
2019/05/05 Javascript
通过说明与示例了解js五种设计模式
2019/06/17 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
python虚拟环境的安装配置图文教程
2017/10/20 Python
Python中实现最小二乘法思路及实现代码
2018/01/04 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
Python 变量类型详解
2018/10/10 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
CSS3基础(RGBa、text-shadow、box-shadow、border-radius)
2012/11/13 HTML / CSS
如何唤起类中的一个方法
2013/11/29 面试题
土地转让协议书
2014/04/15 职场文书
家长高考寄语
2015/02/27 职场文书
2015年基建工作总结范文
2015/05/23 职场文书
同学会演讲稿
2019/04/02 职场文书
详解非极大值抑制算法之Python实现
2021/06/28 Python