再谈javascript图片预加载技术

时间:2011-03-11 19:57:00 

由于javascript无法获取img文件头数据,必须等待其加载完毕后才能获取真实的大小,所以lightbox类效果为了让图片居中显示,导致其速度体验要比直接输出的差很多。而本文所提到的预加载技术主要是让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;
};
};

};


可以看到使用onload的方式必须等待图片加载完毕,其速度不敢恭维。

web应用程序区别于桌面应用程序,响应速度才是最好的用户体验。如果想要速度与优雅兼得,那就必须提前获得图片尺寸,如何在图片没有加载完毕就能获取图片尺寸?

十多年的上网经验告诉我:浏览器在加载图片的时候你会看到图片会先占用一块地然后才慢慢加载完毕,并且这里大部分的图片都是没有预设width与height属性的,因为浏览器能够获取图片的头部数据。基于此,只需要使用javascript定时侦测图片的尺寸状态便可得知图片尺寸就绪的状态。

实现代码:




var imgReady = function (url, callback, error) {
var width, height, intervalId, check, div,
img = new Image(),
body = document.body;

img.src = url;

// 从缓存中读取
if (img.complete) {
return callback(img.width, img.height);
};

// 通过占位提前获取图片头部数据
if (body) {
div = document.createElement('div');
div.style.cssText = 'visibility:hidden;position:absolute;left:0;top:0;width:1px;height:1px;overflow:hidden';
div.appendChild(img)
body.appendChild(div);
width = img.offsetWidth;
height = img.offsetHeight;

check = function () {
if (img.offsetWidth !== width || img.offsetHeight !== height) {
clearInterval(intervalId);
callback(img.offsetWidth, img.clientHeight);
img.onload = null;
div.innerHTML = '';
div.parentNode.removeChild(div);
};
};

intervalId = setInterval(check, 150);
};

// 加载完毕后方式获取
img.onload = function () {
callback(img.width, img.height);
img.onload = img.onerror = null;
clearInterval(intervalId);
body && img.parentNode.removeChild(img);
};

// 图片加载错误
img.onerror = function () {
error && error();
clearInterval(intervalId);
body && img.parentNode.removeChild(img);
};

};

是不是很简单?这样的方式获取摄影级别照片尺寸的速度往往是onload方式的几十多倍,而对于web普通(800×600内)浏览级别的图片能达到秒杀效果。

好了,请观赏令人愉悦的 DEMO ,通过测试的浏览器:Chrome、Firefox、Safari、Opera、IE6、IE7、IE8。

(planeArt.cn原创文章,原文地址。)

标签:lightbox,加载,图片
0
投稿

猜你喜欢

  • asp 读取文件和保存文件函数代码

    2011-04-04 11:17:00
  • asp FSO组件操作详解

    2009-03-20 18:32:00
  • 如何获取SQL Server数据库元数据的方法

    2009-01-19 14:00:00
  • 利用XMLHTTP检测网址及探测服务器类型

    2009-04-24 15:12:00
  • asp 关键词高亮显示(不区分大小写)

    2011-04-07 10:55:00
  • 关于鼠标、键盘的几个事件的例子

    2008-07-27 17:00:00
  • z-index在IE中的迷惑

    2007-05-11 16:50:00
  • asp如何对多个条件进行判断?

    2009-11-20 18:28:00
  • MySQL中两种快速创建空表的方式的区别

    2008-12-17 14:34:00
  • 用Asp+XmlHttp实现RssReader功能

    2008-07-09 12:20:00
  • 通过XSL转换XML文件步骤

    2008-01-27 16:03:00
  • ASP实例:幻灯片新闻代码

    2008-11-21 17:40:00
  • Web表单设计:表单结构

    2011-04-22 12:32:00
  • 随机6+1选号码摇奖程序

    2008-07-18 13:15:00
  • 增加 javascript 的 trim 函数

    2008-04-20 16:54:00
  • IE6局部调用PNG32合并图片

    2009-03-11 21:24:00
  • 浅述七大主流数据库

    2011-08-05 18:21:27
  • 网站如何使用黄金分割布局

    2010-11-05 18:34:00
  • 电子商务搜索LIST页面用户体验设计

    2010-08-03 12:57:00
  • 从if else到switch case再到抽象

    2010-11-05 18:30:00
  • asp之家 网络编程 m.aspxhome.com