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 相关文章推荐
JavaScrip单线程引擎工作原理分析
Sep 04 Javascript
jquery应该如何来设置改变按钮input的onclick事件
Dec 10 Javascript
Javascript中Array.prototype.map()详解
Oct 22 Javascript
JavaScript中数组的22种方法必学(推荐)
Jul 20 Javascript
webpack+vue.js实现组件化详解
Oct 12 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
Dec 17 Javascript
jquery表单验证实例仿Toast提示效果
Mar 03 Javascript
TypeScript入门-接口
Mar 30 Javascript
Vuex之理解Mutations的用法实例
Apr 19 Javascript
关于RxJS Subject的学习笔记
Dec 05 Javascript
layui默认选中table的CheckBox复选框方法
Sep 19 Javascript
Vue获取页面元素的相对位置的方法示例
Feb 05 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
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
改写ThinkPHP的U方法使其路由下分页正常
2014/07/02 PHP
PHP实现自动登入google play下载app report的方法
2014/09/23 PHP
详解PHP中websocket的使用方法
2016/09/15 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
javascript 面向对象的JavaScript类
2010/05/04 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
JavaScript数组的栈方法与队列方法详解
2016/05/26 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
jQuery属性选择器用法示例
2016/09/09 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
jQuery导航条固定定位效果实例代码
2017/05/26 jQuery
JavaScript实现提交模式窗口后刷新父窗口数据的方法
2017/06/16 Javascript
浅谈Vue 数据响应式原理
2018/05/07 Javascript
微信小程序实现自动定位功能
2018/10/31 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
微信小程序使用蓝牙小插件
2019/09/23 Javascript
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
Python的设计模式编程入门指南
2015/04/02 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
python利用JMeter测试Tornado的多线程
2020/01/12 Python
python实现扫雷游戏
2020/03/03 Python
澳大利亚时尚前卫设计师珠宝在线:Amber Sceats
2017/10/04 全球购物
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
实习生自我评价
2014/01/18 职场文书
2014年公司迎新年活动方案
2014/02/24 职场文书
法律系毕业生自荐信范文
2014/03/27 职场文书
环保倡议书怎么写
2014/05/16 职场文书
本科生就业推荐信
2014/05/19 职场文书
建筑投标担保书
2014/05/20 职场文书
学校查摆问题整改措施
2014/09/28 职场文书
教师三严三实心得体会
2014/10/11 职场文书
驻村工作简报
2015/07/20 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
python数字图像处理之图像自动阈值分割示例
2022/06/28 Python