javascript图片预加载实例分析


Posted in Javascript onJuly 16, 2015

本文实例讲述了javascript图片预加载的方法。分享给大家供大家参考。具体如下:

lightbox类效果为了让图片居中显示而使用预加载,需要等待完全加载完毕才能显示,体验不佳(如filick相册的全屏效果)。javascript无法获取img文件头数据,真的是这样吗?本文通过一个巧妙的方法让javascript获取它。

这是大部分人使用预加载获取图片大小的例子:

var imgLoad = function (url, callback) {
  var img = new Image();
  img.src = url;
  if (img.complete) {
    callback(img.width, img.height);
  } else {
    img.onload = function () {
      callback(img.width, img.height);
      img.onload = null;
    };
  };
};

JavaScript代码:

// 更新:
// 05.27: 1、保证回调执行顺序:error > ready > load;2、回调函数this指向img本身
// 04-02: 1、增加图片完全加载后的回调 2、提高性能
/**
 * 图片头数据加载就绪事件 - 更快获取图片尺寸
 * @version 2011.05.27
 * <a href="http://my.oschina.net/arthor" class="referer" target="_blank">@author</a> TangBin
 * <a href="http://my.oschina.net/see" class="referer" target="_blank">@see</a>   http://www.planeart.cn/?p=1121
 * @param  {String}  图片路径
 * @param  {Function} 尺寸就绪
 * @param  {Function} 加载完毕 (可选)
 * @param  {Function} 加载错误 (可选)
 * @example imgReady('http://www.google.com.hk/intl/zh-CN/images/logo_cn.png', function () {
    alert('size ready: width=' + this.width + '; height=' + this.height);
  });
 */
var imgReady = (function () {
  var list = [], intervalId = null,
  // 用来执行队列
  tick = function () {
    var i = 0;
    for (; i < list.length; i++) {
      list[i].end ? list.splice(i--, 1) : list[i]();
    };
    !list.length && stop();
  },
  // 停止所有定时器队列
  stop = function () {
    clearInterval(intervalId);
    intervalId = null;
  };
  return function (url, ready, load, error) {
    var onready, width, height, newWidth, newHeight,
      img = new Image();
    img.src = url;
    // 如果图片被缓存,则直接返回缓存数据
    if (img.complete) {
      ready.call(img);
      load && load.call(img);
      return;
    };
    width = img.width;
    height = img.height;
    // 加载错误后的事件
    img.onerror = function () {
      error && error.call(img);
      onready.end = true;
      img = img.onload = img.onerror = null;
    };
    // 图片尺寸就绪
    onready = function () {
      newWidth = img.width;
      newHeight = img.height;
      if (newWidth !== width || newHeight !== height ||
        // 如果图片已经在其他地方加载可使用面积检测
        newWidth * newHeight > 1024
      ) {
        ready.call(img);
        onready.end = true;
      };
    };
    onready();
    // 完全加载完毕的事件
    img.onload = function () {
      // onload在定时器时间差范围内可能比onready快
      // 这里进行检查并保证onready优先执行
      !onready.end && onready();
      load && load.call(img);
      // IE gif动画会循环执行onload,置空onload即可
      img = img.onload = img.onerror = null;
    };
    // 加入队列中定期执行
    if (!onready.end) {
      list.push(onready);
      // 无论何时只允许出现一个定时器,减少浏览器性能损耗
      if (intervalId === null) intervalId = setInterval(tick, 40);
    };
  };
})();

调用例子:

imgReady('http://www.google.com.hk/intl/zh-CN/images/logo_cn.png', function () {
  alert('size ready: width=' + this.width + '; height=' + this.height);
});

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript 基础篇(一)
Mar 30 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
Dec 14 Javascript
js实现checkbox全选、不选与反选的方法
Feb 09 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
Nov 16 Javascript
JavaScript截取、切割字符串的技巧
Jan 07 Javascript
简单理解js的prototype属性及使用
Dec 07 Javascript
整理一些最近经常遇到的前端面试题
Apr 25 Javascript
深入理解vue Render函数
Jul 19 Javascript
浅谈pc端rem字体设置的问题
Aug 03 Javascript
微信小程序使用canvas的画图操作示例
Jan 18 Javascript
js实现随机8位验证码
Jul 24 Javascript
javascript代码实现简易计算器
Jan 25 Javascript
javascript的BOM汇总
Jul 16 #Javascript
.NET微信公众号开发之创建自定义菜单
Jul 16 #Javascript
初识Javascript小结
Jul 16 #Javascript
浅谈javascript中的DOM方法
Jul 16 #Javascript
详细分析JavaScript函数定义
Jul 16 #Javascript
jQuery时间轴插件使用详解
Jul 16 #Javascript
jQuery实现定时读取分析xml文件的方法
Jul 16 #Javascript
You might like
《APMServ 5.1.2》使用图解
2006/10/23 PHP
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
php字符串截取函数用法分析
2014/11/25 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
2019/10/08 PHP
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
js 未结束的字符串常量错误解决方法
2010/06/13 Javascript
麻雀虽小五脏俱全 Dojo自定义控件应用
2010/09/04 Javascript
javascript的tab切换原理与效果实现方法
2015/01/10 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
jqGrid用法汇总(全经典)
2016/06/28 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
Webpack打包慢问题的完美解决方法
2017/03/16 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
[07:43]《辉夜杯》公开赛晋级外卡赛战队—TRG训练生活探秘
2015/12/11 DOTA
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
Python实现豆瓣图片下载的方法
2015/05/25 Python
python中异常捕获方法详解
2017/03/03 Python
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
详解python做UI界面的方法
2019/02/27 Python
python使用多线程编写tcp客户端程序
2019/09/02 Python
Python笔记之观察者模式
2019/11/20 Python
Python谱减法语音降噪实例
2019/12/18 Python
pycharm通过anaconda安装pyqt5的教程
2020/03/24 Python
python numpy库np.percentile用法说明
2020/06/08 Python
美国户外生活方式品牌:Eddie Bauer
2016/12/28 全球购物
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
2015年母亲节活动总结
2015/02/10 职场文书
交通安全温馨提示语
2015/07/14 职场文书
运动会通讯稿100字
2015/07/20 职场文书
给校长的建议书范文
2015/09/14 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis