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 相关文章推荐
Tips 带三角可关闭的文字提示
Oct 06 Javascript
jquery对单选框,多选框,文本框等常见操作小结
Jan 08 Javascript
JS设置网页图片vspace和hspace属性的方法
Apr 01 Javascript
JavaScript+html5 canvas绘制的小人效果
Jan 27 Javascript
js添加千分位的实现代码(超简单)
Aug 01 Javascript
浅谈EasyUI常用控件的禁用方法
Nov 09 Javascript
JavaScript之排序函数_动力节点Java学院整理
Jun 30 Javascript
解决layui下拉框监听问题(监听不到值的变化)
Sep 28 Javascript
Vue实现base64编码图片间的切换功能
Dec 04 Javascript
vue-cli3 引入 font-awesome的操作
Aug 11 Javascript
让你30分钟快速掌握vue3教程
Oct 26 Javascript
JS闭包原理及其使用场景解析
Dec 03 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变量内存分配问题记录整理
2013/11/27 PHP
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
PHP 7.1新特性的汇总介绍
2016/12/16 PHP
Laravel向公共模板赋值方法总结
2019/06/25 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
简单JS代码压缩器
2006/10/12 Javascript
Javascript操纵Cookie实现购物车程序
2007/02/15 Javascript
JS 建立对象的方法
2007/04/21 Javascript
js 学习笔记(三)
2009/12/29 Javascript
Three.js源码阅读笔记(物体是如何组织的)
2012/12/27 Javascript
javascript制作2048游戏
2015/03/30 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
基于JS实现的随机数字抽签实例
2016/12/08 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
vue利用axios来完成数据的交互
2018/03/23 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
解决VUE-Router 同一页面第二次进入不刷新的问题
2020/07/22 Javascript
[00:12]DAC2018 天才少年转战三号位,他的SOLO是否仍如昔日般强大?
2018/04/06 DOTA
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
Python2中文处理纪要的实现方法
2018/03/10 Python
python如何在列表、字典中筛选数据
2018/03/19 Python
详解python分布式进程
2018/10/08 Python
Python读取JSON数据操作实例解析
2020/05/18 Python
CSS3实现水平居中、垂直居中、水平垂直居中的实例代码
2020/02/27 HTML / CSS
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
利用异或运算实现两个无符号数的加法运算
2013/12/20 面试题
网络体系结构及协议的定义
2014/03/13 面试题
一套软件测试笔试题
2014/07/25 面试题
企业授权委托书范本
2014/09/22 职场文书
失恋33天观后感
2015/06/11 职场文书
毕业生入职感言
2015/07/31 职场文书
2016年学校禁毒宣传活动工作总结
2016/04/05 职场文书
Python使用Web框架Flask开发项目
2022/06/01 Python