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封装的不错的选项卡效果代码
Feb 15 Javascript
jQuery EasyUI API 中文文档 - NumberBox数字框
Oct 13 Javascript
JS图片预加载 JS实现图片预加载应用
Dec 03 Javascript
浅析AngularJS Filter用法
Dec 28 Javascript
JS运动相关知识点小结(附弹性运动示例)
Jan 08 Javascript
JS获取地址栏参数的两种方法(简单实用)
Jun 14 Javascript
jQuery悬停文字提示框插件jquery.tooltipster.js用法示例【附demo源码下载】
Jul 19 Javascript
五步轻松实现JavaScript HTML时钟效果
Mar 25 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
Dec 26 Javascript
微信小程序中如何计算距离某个节日还有多少天
Jul 15 Javascript
JS倒计时两种实现方式代码实例
Jul 27 Javascript
jquery实现简易验证插件封装
Sep 13 jQuery
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
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
用PHP和ACCESS写聊天室(八)
2006/10/09 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
2017/10/07 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
jquery 多级下拉菜单核心代码
2010/05/21 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
2010/09/15 Javascript
BOM与DOM的区别分析
2010/10/26 Javascript
一些常用的JavaScript函数(json)附详细说明
2011/05/25 Javascript
遍历jquery对象的代码分享
2011/11/02 Javascript
Textarea与懒惰渲染实现代码
2012/01/04 Javascript
详解JavaScript中|单竖杠运算符的使用方法
2016/05/23 Javascript
jQuery实现点击弹出背景变暗遮罩效果实例代码
2016/06/24 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
2016/07/09 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
详解webpack3编译兼容IE8的正确姿势
2017/12/21 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
深入理解ES6中let和闭包
2018/02/22 Javascript
jQuery实现的简单拖拽功能示例【测试可用】
2018/08/14 jQuery
jQuery实现简单的Ajax调用功能示例
2019/02/15 jQuery
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
解决vue props传Array/Object类型值,子组件报错的情况
2020/11/07 Javascript
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
Python使用pyshp库读取shapefile信息的方法
2018/12/29 Python
代码详解django中数据库设置
2019/01/28 Python
Python_查看sqlite3表结构,查询语句的示例代码
2019/07/17 Python
Python实现滑动平均(Moving Average)的例子
2019/08/24 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
如何在Windows中安装多个python解释器
2020/06/16 Python
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
合作意向书
2014/07/30 职场文书
党员教师群众路线个人整改措施
2014/10/28 职场文书
2015年党务公开工作总结
2015/05/19 职场文书
MySQL sql模式设置引起的问题
2022/05/15 MySQL