1,脚本代码:

  1. /**
  2. * 图片头数据加载就绪事件 - 更快获取图片尺寸
  3. * @version 2011.05.27
  4. * @author TangBin
  5. * @see http://www.planeart.cn/?p=1121
  6. * @param {String} 图片路径
  7. * @param {Function} 尺寸就绪
  8. * @param {Function} 加载完毕 (可选)
  9. * @param {Function} 加载错误 (可选)
  10. * @example imgReady('http://www.google.com.hk/intl/zh-CN/images/logo_cn.png', function () {
  11. alert('size ready: width=' + this.width + '; height=' + this.height);
  12. });
  13. */
  14. var imgReady = (function () {
  15. var list = [], intervalId = null,
  16.  
  17. // 用来执行队列
  18. tick = function () {
  19. var i = 0;
  20. for (; i < list.length; i++) {
  21. list[i].end ? list.splice(i--, 1) : list[i]();
  22. };
  23. !list.length && stop();
  24. },
  25.  
  26. // 停止所有定时器队列
  27. stop = function () {
  28. clearInterval(intervalId);
  29. intervalId = null;
  30. };
  31.  
  32. return function (url, ready, load, error) {
  33. var onready, width, height, newWidth, newHeight,
  34. img = new Image();
  35.  
  36. img.src = url;
  37.  
  38. // 如果图片被缓存,则直接返回缓存数据
  39. if (img.complete) {
  40. ready.call(img);
  41. load && load.call(img);
  42. return;
  43. };
  44.  
  45. width = img.width;
  46. height = img.height;
  47.  
  48. // 加载错误后的事件
  49. img.onerror = function () {
  50. error && error.call(img);
  51. onready.end = true;
  52. img = img.onload = img.onerror = null;
  53. };
  54.  
  55. // 图片尺寸就绪
  56. onready = function () {
  57. newWidth = img.width;
  58. newHeight = img.height;
  59. if (newWidth !== width || newHeight !== height ||
  60. // 如果图片已经在其他地方加载可使用面积检测
  61. newWidth * newHeight > 1024
  62. ) {
  63. ready.call(img);
  64. onready.end = true;
  65. };
  66. };
  67. onready();
  68.  
  69. // 完全加载完毕的事件
  70. img.onload = function () {
  71. // onload在定时器时间差范围内可能比onready快
  72. // 这里进行检查并保证onready优先执行
  73. !onready.end && onready();
  74.  
  75. load && load.call(img);
  76.  
  77. // IE gif动画会循环执行onload,置空onload即可
  78. img = img.onload = img.onerror = null;
  79. };
  80.  
  81. // 加入队列中定期执行
  82. if (!onready.end) {
  83. list.push(onready);
  84. // 无论何时只允许出现一个定时器,减少浏览器性能损耗
  85. if (intervalId === null) intervalId = setInterval(tick, 40);
  86. };
  87. };
  88. })();

2,调用方式:

2     alert('size ready: width=' this.width + '; height=' this.height);
3 });

(通过测试的浏览器:Chrome、Firefox、Safari、Opera、IE6、IE7、IE8)

原文链接:http://www.planeart.cn/?p=1121

【转】javascript-图片预加载技术的更多相关文章

  1. 再谈javascript图片预加载技术

    图片预加载技术的典型应用: 如lightbox方式展现照片,无疑需要提前获得大图的尺寸,这样才能居中定位,由于javascript无法获取img文件头数据,必须等待其加载完毕后才能获取真实的大小然后展 ...

  2. Javascript图片预加载详解

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  3. Javascript图片预加载详解 分类: JavaScript HTML+CSS 2015-05-29 11:01 768人阅读 评论(0) 收藏

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  4. javascript图片预加载

    图片预加载是非常常见的一个功能,PC和移动端都会用到,尤其是在移动端,只要涉及到较多图片的加载都会用到该技术.下面是移动端用到的,引入了zepto. <!DOCTYPE html> < ...

  5. javascript 图片预加载

    <!DOCTYPE > <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ...

  6. 转载:用Jquery实现的图片预加载技术,可以实现有序加载和无序加载!

    一.背景 我们在做页面的时候,从用户体验的角度出发,肯定是希望用户以最快的速度看到完整的页面信息,但在实际情况中经常会遇到些问题. 比如受网速影响,页面加载素材的时间比较长,页面会出现短时间的错乱或者 ...

  7. 用es6类封装的图片预加载技术!

    1.HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  8. JQ封装图片预加载插件

    我们知道,图片的加载,特别是资源较大的图片,加载相当耗费时间.为了提高用户体验,不得不使用图片预加载技术来提前加载,以提高用户在浏览时的流畅度. 先来弄明白图片的懒加载和预加载的不同: 1)概念:懒加 ...

  9. 利用CSS、JavaScript及Ajax实现图片预加载的三大方法

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  10. javascript图片懒加载与预加载的分析

    javascript图片懒加载与预加载的分析 懒加载与预加载的基本概念.  懒加载也叫延迟加载:前一篇文章有介绍:JS图片延迟加载 延迟加载图片或符合某些条件时才加载某些图片. 预加载:提前加载图片, ...

随机推荐

  1. [hackerrank]The Love-Letter Mystery

    https://www.hackerrank.com/contests/w3/challenges/the-love-letter-mystery 简单题. #include <cstdlib& ...

  2. 未能加载文件或程序集“Interop.jmail”或它的某一个依赖项

    未能加载文件或程序集“Interop.jmail”或它的某一个依赖项.试图加载格式不正确的程序. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中 ...

  3. Drawit插件

    gvim用不了画矩形的功能,只能在vim下用 \di,\ds开始/结束画图(Vim里\按键没有被映射,可以做leader按键) 用鼠标选择一块之后,\b画矩形,\e画椭圆 选单行\a画箭头,\l画线 ...

  4. ASP.NET MVC 学习3、Controller左手从Model获取数据,右手传递到View页面

    参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/accessing-your-models-dat ...

  5. UVa 1658 (拆点法 最小费用流) Admiral

    题意: 给出一个有向带权图,求从起点到终点的两条不相交路径使得权值和最小. 分析: 第一次听到“拆点法”这个名词. 把除起点和终点以外的点拆成两个点i和i',然后在这两点之间连一条容量为1,费用为0的 ...

  6. Js 读写cookies

    //写cookies函数 function setCookie(name, value)//两个参数,一个是cookie的名子,一个是值 { var Days = 30; //此 cookie 将被保 ...

  7. 自定义View等待旋转

    效果图 1 string.xml <string name="default_progressbar">Default Progressbar:</string& ...

  8. Java程序员常用工具集

    我发现很多人没办法高效地解决问题的关键原因是不熟悉工具,不熟悉工具也还罢了,甚至还不知道怎么去找工具,这个问题就大条了.我想列下我能想到的一个Java程序员会用到的常用工具. 一.编码工具 1.IDE ...

  9. VirtualBox的工作原理&参考网上文章

    事先申明,我这里有好多东西都是看网上的,文末给出参考博客链接. 1.在设置里面为什么要选择桥接网络?baidu之后,了解到是虚拟机工作原理的不同,也就是说有好几种工作模式. bridged(桥接模式) ...

  10. windows装liunx双系统

    http://jingyan.baidu.com/article/60ccbceb18624464cab197ea.html http://jingyan.baidu.com/article/76a7 ...