学习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 相关文章推荐
HTML 自动伸缩的表格Table js实现
Apr 01 Javascript
jquery tools之tabs 选项卡/页签
Jul 25 Javascript
浅析Cookie中的Path与domain
Dec 18 Javascript
jquery控制display属性为none或block
Mar 31 Javascript
jQuery 2.0.3 源码分析之core(一)整体架构
May 27 Javascript
Javascript基础知识盲点总结之函数
May 15 Javascript
Sortable.js拖拽排序使用方法解析
Nov 04 Javascript
JavaScript与Java正则表达式写法的区别介绍
Aug 15 Javascript
js使用原型对象(prototype)需要注意的地方
Aug 28 Javascript
JS和JQuery实现雪花飘落效果
Nov 30 jQuery
js根据需要计算数组中重复出现某个元素的个数
Jan 18 Javascript
Python机器学习之决策树和随机森林
Jul 15 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+iframe实现隐藏无刷新上传文件
2012/02/10 PHP
PHP笔记之:基于面向对象设计的详解
2013/05/14 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
2019/03/08 PHP
为数据添加append,remove功能
2006/10/03 Javascript
jquery中的 $("#jb51")与document.getElementById("jb51") 的区别
2011/07/26 Javascript
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
jquery实现邮箱自动补全功能示例分享
2014/02/17 Javascript
使用jQuery判断IE浏览器版本的代码
2014/06/14 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
如何使用AngularJs打造权限管理系统【简易型】
2016/05/09 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
React Native之TextInput组件解析示例
2017/08/22 Javascript
vue最简单的前后端交互示例详解
2018/10/11 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
js实现select下拉框选择
2020/01/11 Javascript
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
在pycharm下设置自己的个性模版方法
2019/07/15 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
2020/02/27 Python
如何使用python切换hosts文件
2020/04/29 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
使用HTML5的链接预取功能(link prefetching)给网站提速
2012/12/13 HTML / CSS
HTML5实现锚点时请使用id取代name
2013/09/06 HTML / CSS
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
opencv实现图像平移效果
2021/03/24 Python
学生发电厂实习自我鉴定
2013/09/22 职场文书
外贸英语毕业生自荐信
2013/11/14 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
违纪开除通知书
2015/04/25 职场文书
高二化学教学反思
2016/02/22 职场文书
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫