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 相关文章推荐
jquery下onpropertychange事件的绑定方法
Aug 01 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
Dec 04 Javascript
动态加载js、css等文件跨iframe实现
Feb 24 Javascript
自己使用js/jquery写的一个定制对话框控件
May 02 Javascript
js从Cookies里面取值的简单实现
Jun 30 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
Mar 20 Javascript
Javascript中神奇的this
Jan 20 Javascript
基于JavaScript实现前端文件的断点续传
Oct 17 Javascript
vue使用vue-i18n实现国际化的实现代码
Apr 08 Javascript
微信小程序实现左右联动的实战记录
Jul 05 Javascript
详解原生JS动态添加和删除类
Mar 26 Javascript
javascript前端和后台进行数据交互方法示例
Aug 07 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
phpexcel导出excel的颜色和网页中的颜色显示不一致
2012/12/11 PHP
ThinkPHP中的关联模型注意点
2014/06/16 PHP
Yii2 assets清除缓存的方法
2016/05/16 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
laravel-admin的多级联动方法
2019/09/30 PHP
JavaScript 拾漏补遗
2009/12/27 Javascript
javascript初学者常用技巧
2014/09/02 Javascript
关于延迟加载JavaScript
2015/05/05 Javascript
JavaScript提高性能知识点汇总
2016/01/15 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
微信小程序如何自定义table组件
2019/06/29 Javascript
javascript设计模式 ? 享元模式原理与用法实例分析
2020/04/15 Javascript
通过vue.extend实现消息提示弹框的方法记录
2021/01/07 Vue.js
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
大学生简历中个人的自我评价
2013/10/06 职场文书
烹饪自我鉴定
2014/03/01 职场文书
骨干教师考核方案
2014/05/09 职场文书
法院信息化建设方案
2014/05/21 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
党的群众路线教育实践活动心得体会(乡镇)
2014/11/03 职场文书
2014会计年终工作总结
2014/12/20 职场文书
2014年个人年终总结
2015/03/09 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
现货白银电话营销话术
2015/05/29 职场文书
杨善洲电影观后感
2015/06/04 职场文书