学习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(jquery)利用函数修改全局变量的代码
Nov 02 Javascript
jQuery 1.4 15个你应该知道的新特性(译)
Jan 24 Javascript
node.js解决获取图片真实文件类型的问题
Dec 20 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
Jan 28 Javascript
javascript给span标签赋值的方法
Nov 26 Javascript
谈谈JavaScript中的几种借用方法
Aug 09 Javascript
jQuery实现的导航下拉菜单效果示例
Sep 05 Javascript
javascript实现简单的可随机变色网页计算器示例
Dec 30 Javascript
详谈表单格式化插件jquery.serializeJSON
Jun 23 jQuery
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
Feb 20 jQuery
详解在React项目中安装并使用Less(用法总结)
Mar 18 Javascript
js实现车辆管理系统
Aug 26 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导出Word文档的原理和实例
2013/10/21 PHP
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
2014/11/19 PHP
PHP编写文件多服务器同步程序
2016/07/02 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
thinkphp框架page类与bootstrap分页(美化)
2017/06/25 PHP
jquery ajax return没有返回值的解决方法
2011/10/20 Javascript
javascript 终止函数执行操作
2014/02/14 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
EasyUI实现第二层弹出框的方法
2015/03/01 Javascript
javascript版2048小游戏
2015/03/18 Javascript
JavaScript中模拟实现jsonp
2015/06/19 Javascript
jQuery.extend 函数及用法详细
2015/09/06 Javascript
6种javascript显示当前系统时间代码
2015/12/01 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
2016/10/27 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
2017/01/14 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
jquery.validate表单验证插件使用详解
2017/06/21 jQuery
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
python批量同步web服务器代码核心程序
2014/09/01 Python
跟老齐学Python之画圈还不简单吗?
2014/09/20 Python
python编程实现希尔排序
2017/04/13 Python
Python实现简单求解给定整数的质因数算法示例
2018/03/25 Python
python生成不重复随机数和对list乱序的解决方法
2018/04/09 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
2019/04/29 Python
通过实例解析Python调用json模块
2019/12/11 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
python 爬虫之selenium可视化爬虫的实现
2020/12/04 Python
佳能德国网上商店:Canon德国
2017/03/18 全球购物
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
小学校长竞聘演讲稿
2014/05/16 职场文书
公务员个人总结
2015/02/12 职场文书
面试必问:圣杯布局和双飞翼布局的区别
2021/05/13 HTML / CSS
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏