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 相关文章推荐
在 IE 中调用 javascript 打开 Excel 表
Dec 21 Javascript
js文字滚动停顿效果代码
Jun 28 Javascript
javascript中方便增删改cookie的一个类
Oct 11 Javascript
JavaScript包装对象使用介绍
Aug 29 Javascript
JS实现一键回顶功能示例代码
Oct 28 Javascript
js判断文本框输入的内容是否为数字
Dec 23 Javascript
Javascript中的prototype与继承
Feb 06 Javascript
Vue-Router实现组件间跳转的三种方法
Nov 07 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
Nov 05 Javascript
JS中this的4种绑定规则详解
Feb 04 Javascript
Vue时间轴 vue-light-timeline的用法说明
Oct 29 Javascript
如何在vue中使用HTML 5 拖放API
Jan 14 Vue.js
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+ajax实时刷新简单实例
2015/02/25 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
thinkphp自定义权限管理之名称判断方法
2017/04/01 PHP
PHP实现图片的等比缩放和Logo水印功能示例
2017/05/04 PHP
jQuery 方法大全方便学习参考
2010/02/25 Javascript
细说javascript函数从函数的构成开始
2013/08/29 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
2013/09/27 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
jquery与js实现全选功能的区别
2017/06/11 jQuery
详解Angular2响应式表单
2017/06/14 Javascript
微信小程序如何获取用户手机号
2018/01/26 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
简化版的vue-router实现思路详解
2018/10/19 Javascript
javascript实现手动点赞效果
2019/04/09 Javascript
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
ES2020 新特性(种草)
2020/01/12 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
[01:48:04]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第一场 2月7日
2021/03/11 DOTA
Python和Go语言的区别总结
2019/02/20 Python
Python实现计算对象的内存大小示例
2019/07/10 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
2020/01/02 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
通过cmd进入python的步骤
2020/06/16 Python
简述 Python 的类和对象
2020/08/21 Python
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
2015年助理政工师工作总结
2015/05/26 职场文书
vue使用v-model进行跨组件绑定的基本实现方法
2021/04/28 Vue.js