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 相关文章推荐
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
Jan 29 Javascript
angularJS中router的使用指南
Feb 09 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
Feb 24 Javascript
详解JavaScript编程中正则表达式的使用
Oct 25 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
Jan 11 Javascript
微信小程序 动态绑定数据及动态事件处理
Mar 14 Javascript
JS ES6中setTimeout函数的执行上下文示例
Apr 27 Javascript
JavaScript监听手机物理返回键的两种解决方法
Aug 14 Javascript
初识 Vue.js 中的 *.Vue文件
Nov 22 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
Jan 29 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
Feb 25 Javascript
JavaScript find()方法及返回数据实例
Apr 30 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
PHPCMS的使用小结
2010/09/20 PHP
php实现文件下载更能介绍
2012/11/23 PHP
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
适合PHP初学者阅读的4本经典书籍
2016/09/23 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
PHP APP微信提现接口代码
2018/09/30 PHP
JavaScript Prototype对象
2009/01/07 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
jQuery中关于ScrollableGridPlugin.js(固定表头)插件的使用逐步解析
2014/07/17 Javascript
jQuery实现带有洗牌效果的动画分页实例
2015/08/31 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
移动端刮刮乐的实现方式(js+HTML5)
2017/03/23 Javascript
Vue的百度地图插件尝试使用
2017/09/06 Javascript
JS实现按钮添加背景音乐示例代码
2017/10/17 Javascript
vue中post请求以a=a&amp;b=b 的格式写遇到的问题
2018/04/27 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
2019/12/06 Javascript
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
Python django实现简单的邮件系统发送邮件功能
2017/07/14 Python
Python实现字典(dict)的迭代操作示例
2018/06/05 Python
python计算日期之间的放假日期
2018/06/05 Python
解决json中ensure_ascii=False的问题
2020/04/03 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
Python如何使用ConfigParser读取配置文件
2020/11/12 Python
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
C面试题
2015/10/08 面试题
深圳-东方伟业笔试部分
2015/02/11 面试题
同事打架检讨书
2014/02/04 职场文书
十八届三中全会报告学习材料
2014/02/17 职场文书
学党史心得体会
2014/09/05 职场文书
办公室班子四风问题对照检查材料
2014/10/04 职场文书
小学家长通知书评语
2014/12/31 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
Redis批量生成数据的实现
2022/06/05 Redis