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 事件记录使用说明
Oct 20 Javascript
Jquery实现无刷新DropDownList联动实现代码
Mar 08 Javascript
jQuery怎么解析Json字符串(Json格式/Json对象)
Aug 09 Javascript
js脚本实现数据去重
Nov 27 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
Aug 25 Javascript
javascript下使用Promise封装FileReader
Feb 19 Javascript
关于网页中的无缝滚动的js代码
Jun 09 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
Sep 30 Javascript
jQuery选择器之子元素过滤选择器
Sep 28 jQuery
Vue.js组件间通信方式总结【推荐】
Nov 23 Javascript
Javascript和jquery在selenium的使用过程
Oct 31 jQuery
js Math数学简单使用操作示例
Mar 13 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中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
深入php内核之php in array
2015/11/10 PHP
stripos函数知识点实例分享
2019/02/11 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
Yii Framework框架开发微信公众平台示例
2020/04/26 PHP
javascript里的条件判断
2007/02/27 Javascript
JavaScript EasyPager 分页函数
2011/05/25 Javascript
javascript 文本框水印/占位符(watermark/placeholder)实现方法
2012/01/15 Javascript
解决ueditor jquery javascript 取值问题
2014/12/30 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
分享10个优化代码的CSS和JavaScript工具
2016/05/11 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
利用Node.js制作爬取大众点评的爬虫
2016/09/22 Javascript
微信小程序 video组件详解
2016/10/25 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
vue2配置scss的方法步骤
2019/06/06 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
python list元素为tuple时的排序方法
2018/04/18 Python
Django中反向生成models.py的实例讲解
2018/05/30 Python
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
Django中的ajax请求
2018/10/19 Python
对python中的装包与解包实例详解
2019/08/24 Python
使用pytorch和torchtext进行文本分类的实例
2020/01/08 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
用Python制作音乐海报
2021/01/26 Python
python实现银行账户系统
2021/02/22 Python
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
利用HTML5实现使用按钮控制背景音乐开关
2015/09/21 HTML / CSS
艺术系大学生毕业个人自我评价
2013/09/19 职场文书
物理教学随笔感言
2014/02/22 职场文书
网络技术专业求职信
2014/07/13 职场文书
上学路上观后感
2015/06/16 职场文书
父亲节感言
2015/08/03 职场文书