再谈JavaScript图片预加载技术
创始人
2024-07-23 09:31:03
0

51CTO推荐专题:JavaScript学习笔记 有问有答

一段典型的使用预加载获取图片大小的例子:

  1. var imgLoad = function (url, callback) {  
  2. var img = new Image();  
  3.  
  4. img.src = url;  
  5. if (img.complete) {  
  6. callback(img.width, img.height);  
  7. } else {  
  8. img.onload = function () {  
  9. callback(img.width, img.height);  
  10. img.onload = null;  
  11. };  
  12. };  
  13.  
  14. }; 

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

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

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

实现代码:

  1. var imgReady = function (url, callback, error) {  
  2. var width, height, intervalId, check, div,  
  3. img = new Image(),  
  4. body = document.body;  
  5.  
  6. img.src = url;  
  7.  
  8. // 从缓存中读取  
  9. if (img.complete) {  
  10. return callback(img.width, img.height);  
  11. };  
  12.  
  13. // 通过占位提前获取图片头部数据  
  14. if (body) {  
  15. div = document.createElement('div');  
  16. div.style.cssText = 'visibility:hidden;position:absolute;left:0;top:0;width:1px;height:1px;overflow:hidden';  
  17. div.appendChild(img)  
  18. body.appendChild(div);  
  19. width = img.offsetWidth;  
  20. height = img.offsetHeight;  
  21.  
  22. check = function () {  
  23. if (img.offsetWidth !== width || img.offsetHeight !== height) {  
  24. clearInterval(intervalId);  
  25. callback(img.offsetWidth, img.clientHeight);  
  26. img.onload = null;  
  27. div.innerHTML = '';  
  28. div.parentNode.removeChild(div);  
  29. };  
  30. };  
  31.  
  32. intervalId = setInterval(check, 150);  
  33. };  
  34.  
  35. // 加载完毕后方式获取  
  36. img.onload = function () {  
  37. callback(img.width, img.height);  
  38. img.onload = img.onerror = null;  
  39. clearInterval(intervalId);  
  40. body && img.parentNode.removeChild(img);  
  41. };  
  42.  
  43. // 图片加载错误  
  44. img.onerror = function () {  
  45. error && error();  
  46. clearInterval(intervalId);  
  47. body && img.parentNode.removeChild(img);  
  48. };  
  49.  
  50. }; 

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

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

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

【编辑推荐】

  1. 示例:JavaScript中的后续传递风格
  2. JavaScript中同名标识符优先级详解
  3. 浅析JavaScript继承方式
  4. 如何编写高质量的JavaScript代码
  5. 通过JavaScript或PHP检测Android设备

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...