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网页制作特殊效果用随机数
May 22 Javascript
html5 canvas js(数字时钟)实例代码
Dec 23 Javascript
js function定义函数的几种不错方法
Feb 27 Javascript
JavaScript解析json格式数据简单示例
Dec 09 Javascript
JavaScript中使用Callback控制流程介绍
Mar 16 Javascript
深入理解bootstrap框架之入门准备
Oct 09 Javascript
vue数据双向绑定原理解析(get &amp; set)
Mar 08 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
Jun 20 jQuery
javascript兼容性(实例讲解)
Aug 15 Javascript
elementUI多选框反选的实现代码
Apr 03 Javascript
js实现弹出框的拖拽效果实例代码详解
Apr 16 Javascript
OpenLayers3实现对地图的基本操作
Sep 28 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获取当前日期和时间及格式化方法参数
2015/05/11 PHP
PHP运行模式汇总
2016/11/06 PHP
javascript里的条件判断
2007/02/27 Javascript
从零开始学习jQuery (三) 管理jQuery包装集
2011/02/23 Javascript
25个非常棒的jQuery滑块插件和教程小结
2011/09/02 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
JS将unicode码转中文方法
2017/05/08 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
基于vue 开发中出现警告问题去除方法
2018/01/25 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
js实现各浏览器全屏代码实例
2018/07/03 Javascript
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
在vue中实现点击选择框阻止弹出层消失的方法
2018/09/15 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
详解vue-element Tree树形控件填坑路
2019/03/26 Javascript
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
[01:45]IMBATV TI4前线报道-选手到达
2014/07/07 DOTA
python函数参数*args**kwargs用法实例
2013/12/04 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
windows下安装Python和pip终极图文教程
2017/03/05 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
2020/01/20 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
jupyter notebook 写代码自动补全的实现
2020/11/02 Python
CSS改变网页中鼠标选中文字背景颜色例子
2014/04/23 HTML / CSS
高清安全摄像头系统:Lorex Technology
2018/07/20 全球购物
教师年终个人自我评价
2013/10/04 职场文书
商业项目策划方案
2014/06/05 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
教师民族团结演讲稿
2014/08/27 职场文书
运动会广播稿200字
2014/10/18 职场文书
2015年银行工作总结范文
2015/04/01 职场文书
2015年女工委工作总结
2015/07/27 职场文书
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python