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 相关文章推荐
用js 让图片在 div或dl里 居中,底部对齐
Jan 21 Javascript
javascript 表单验证常见正则
Sep 28 Javascript
用jQuery获取IE9下拉框默认值问题探讨
Jul 22 Javascript
jquery 提示信息显示后自动消失的具体实现
Dec 18 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
Aug 15 Javascript
window.location.hash知识汇总
Nov 09 Javascript
举例说明JavaScript中的实例对象与原型对象
Mar 11 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
Nov 08 jQuery
React-Router如何进行页面权限管理的方法
Dec 06 Javascript
详解Webpack实战之构建 Electron 应用
Dec 25 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
Apr 24 Javascript
vue基本使用--refs获取组件或元素的实例
Nov 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
怎么样可以把 phpinfo()屏蔽掉?
2006/11/24 PHP
php访问数组最后一个元素的函数end()用法
2015/03/18 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
索趣科技的答案
2007/02/07 Javascript
input按钮的事件处理大全
2010/12/10 Javascript
javascript不可用的问题探究
2013/10/01 Javascript
jqGrid读取选择的多行的某个属性代码
2014/05/18 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
jquery使用each方法遍历json格式数据实例
2015/05/18 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
解决layer.confirm快速点击会重复触发事件的问题
2019/09/23 Javascript
在vue中使用防抖函数组件操作
2020/07/26 Javascript
Python 迭代器与生成器实例详解
2017/05/18 Python
Python实现网站注册验证码生成类
2017/06/08 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
微信跳一跳游戏python脚本
2020/04/01 Python
将字典转换为DataFrame并进行频次统计的方法
2018/04/08 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
解决python3 urllib 链接中有中文的问题
2018/07/16 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
基于python进行抽样分布描述及实践详解
2019/09/02 Python
Python字符串格式化输出代码实例
2019/11/22 Python
Python作用域与名字空间原理详解
2020/03/21 Python
Python中有几个关键字
2020/06/04 Python
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
Java的五个基础面试题
2016/02/26 面试题
财务出纳员岗位职责
2013/11/26 职场文书
十佳青年个人事迹材料
2014/01/28 职场文书
球队口号
2014/06/18 职场文书
2014年教育培训工作总结
2014/12/08 职场文书
简短清晨问候语
2015/11/10 职场文书
2016年度继续教育学习心得体会
2016/01/19 职场文书
标准发言稿结尾
2019/07/18 职场文书