学习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 相关文章推荐
基于jquery的修改当前TAB显示标题的代码
Dec 11 Javascript
jQuery数据显示插件整合实现代码
Oct 24 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
Nov 07 Javascript
js将iframe中控件的值传到主页面控件中的实现方法
Mar 11 Javascript
用javascript判断IE版本号简单实用且向后兼容
Sep 11 Javascript
jQuery中:first选择器用法实例
Dec 30 Javascript
微信小程序-消息提示框实例
Nov 24 Javascript
react高阶组件经典应用之权限控制详解
Sep 07 Javascript
vuejs使用递归组件实现树形目录的方法
Sep 30 Javascript
vue实现微信获取用户信息的方法
Mar 21 Javascript
layui在form表单页面通过Validform加入简单验证的方法
Sep 06 Javascript
详解Vue template 如何支持多个根结点
Feb 10 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
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
编写自己的php扩展函数
2006/10/09 PHP
PHP UTF8中文字符截断函数代码
2012/09/11 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
js函数使用技巧之 setTimeout(function(){},0)
2009/02/09 Javascript
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
animate动画示例(泪奔的小孩)及stop和delay的使用
2013/05/06 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
jQuery自动完成插件completer附源码下载
2016/01/04 Javascript
jQuery验证插件validate使用方法详解
2020/09/13 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
老生常谈js中0到底是 true 还是 false
2017/03/08 Javascript
vuejs如何配置less
2017/04/25 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
python中self原理实例分析
2015/04/30 Python
在Python的Django框架中创建和使用模版
2015/07/15 Python
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
对Python中DataFrame按照行遍历的方法
2018/04/08 Python
python创造虚拟环境方法总结
2019/03/04 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
给Django Admin添加验证码和多次登录尝试限制的实现
2020/07/26 Python
使用CSS3实现SVG路径描边动画效果入门教程
2019/10/21 HTML / CSS
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
Martinelli官方商店:西班牙皮鞋和高跟鞋品牌
2019/07/30 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
后勤主管岗位职责
2014/03/01 职场文书
单位单身证明样本
2014/10/11 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
护士辞职信怎么写
2015/02/27 职场文书
JavaScript实现贪吃蛇游戏
2021/06/16 Javascript