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与CSS复习(二)
Jun 29 Javascript
extjs表格文本启用选择复制功能具体实现
Oct 11 Javascript
在myeclipse中如何加入jquery代码提示功能
Jun 03 Javascript
Bootstrap自定义文件上传下载样式
May 26 Javascript
JavaScript基于原型链的继承
Jun 22 Javascript
轻松掌握JavaScript状态模式
Sep 07 Javascript
JS轮播图中缓动函数的封装
Nov 25 Javascript
Vue响应式原理详解
Apr 18 Javascript
JavaScript之map reduce_动力节点Java学院整理
Jun 29 Javascript
Vue Cli与BootStrap结合实现表格分页功能
Aug 18 Javascript
vue使用axios时关于this的指向问题详解
Dec 22 Javascript
express如何使用session与cookie的方法
Jan 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
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
Ctrl+Enter提交内容信息
2006/06/26 Javascript
Jquery 实现Tab效果 思路是js思路
2010/03/02 Javascript
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
关于使用 jBox 对话框的提交不能弹出问题解决方法
2012/11/07 Javascript
使用javascript创建快捷方式的简单实例
2013/08/09 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
2016/05/04 Javascript
微信小程序 网络API发起请求详解
2016/11/09 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
jQuery Json数据格式排版高亮插件json-viewer.js使用方法详解
2017/06/12 jQuery
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
AngularJs的UI组件ui-Bootstrap之Tooltip和Popover
2018/07/13 Javascript
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
jquery简单实现纵向的无缝滚动代码实例
2019/04/01 jQuery
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
[01:08:57]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第二场
2014/05/24 DOTA
[02:27]2014DOTA2国际邀请赛 VG赛后采访:更大的挑战在等着我们
2014/07/13 DOTA
[14:21]VICI vs EG (BO3)
2018/06/07 DOTA
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
python在文本开头插入一行的实例
2018/05/02 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
浅谈python3发送post请求参数为空的情况
2018/12/28 Python
Python构建图像分类识别器的方法
2019/01/12 Python
在 Pycharm 安装使用black的方法详解
2020/04/02 Python
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
小学英语教学反思
2014/01/30 职场文书
酒店中秋节活动方案
2014/01/31 职场文书
建设单位项目负责人任命书
2014/06/06 职场文书
国家奖学金获奖感言
2014/08/16 职场文书
2014年平安夜寄语
2014/12/08 职场文书
原生JS封装vue Tab切换效果
2021/04/28 Vue.js
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
SQL写法--行行比较
2021/08/23 SQL Server