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 相关文章推荐
可以将word转成html的js代码
Apr 11 Javascript
javascript event 事件解析
Jan 31 Javascript
JQuery CheckBox(复选框)操作方法汇总
Apr 15 Javascript
13个PHP函数超实用
Oct 21 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
Nov 12 Javascript
微信小程序之小豆瓣图书实例
Nov 30 Javascript
jQuery Ajax前后端使用JSON进行交互示例
Mar 17 Javascript
基于Vue中点击组件外关闭组件的实现方法
Mar 06 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
Apr 20 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
May 29 Javascript
vue.js使用watch监听路由变化的方法
Jul 08 Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
Dec 24 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 飞信好友免费短信API接口开源版
2010/07/22 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
php隐藏实际地址的文件下载方法
2015/04/18 PHP
PHP类相关知识点实例总结
2016/09/28 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
零基础php编程好学吗
2019/10/11 PHP
浅谈laravel orm 中的一对多关系 hasMany
2019/10/21 PHP
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
js截取中英文字符串、标点符号无乱码示例解读
2014/04/17 Javascript
JS判断客服QQ号在线还是离线状态的方法
2015/01/13 Javascript
javascript委托(Delegate)blur和focus用法实例分析
2015/05/26 Javascript
Nodejs学习item【入门手上】
2016/05/05 NodeJs
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
2017/11/14 jQuery
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
2020/06/02 Javascript
在vue中使用console.log无效的解决
2020/08/09 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
[02:22]完美世界DOTA2联赛PWL S3 集锦第一期
2020/12/15 DOTA
Python struct.unpack
2008/09/06 Python
python根据京东商品url获取产品价格
2015/08/09 Python
Python实现获取命令行输出结果的方法
2017/06/10 Python
详解python做UI界面的方法
2019/02/27 Python
pygame实现俄罗斯方块游戏(基础篇2)
2019/10/29 Python
python实现学生通讯录管理系统
2021/02/25 Python
美国正宗奢华复古手袋、珠宝及配饰网站:What Goes Around Comes Around
2018/07/21 全球购物
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
英文简历中的自我评价
2013/10/06 职场文书
《中华少年》教学反思
2014/02/15 职场文书
老公保证书
2015/01/17 职场文书
2015年化验员工作总结
2015/04/10 职场文书
2015年乡镇民政工作总结
2015/05/13 职场文书
node快速搭建后台的实现步骤
2022/02/18 NodeJs
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL