再谈javascript图片预加载技术

踩坑实录:用Python脚本给AU5315时钟芯片做二次固化,这几个寄存器配置千万别搞错 本文详细解析了AU5315时钟芯片二次固化过程中的关键寄存器配置陷阱,特别是0x10、0x22和0x0f寄存器的操作要点。通过实战案例和时序分析,帮助开发者避免常见错误,提升I2C通信稳定性和固化成功率,适用于嵌入式系统开发中的时钟管理优化。 阅读详情
比onload更快获取图片尺寸

文章更新:2011-05-31
lightbox类效果为了让图片居中显示而使用预加载,需要等待完全加载完毕才能显示,体验不佳(如filick相册的全屏效果)。javascript无法获取img文件头数据,真的是这样吗?本文通过一个巧妙的方法让javascript获取它。

这是大部分人使用预加载获取图片大小的例子:

01 var imgLoad = function (url, callback) {
02     var img = new Image();
03  
04     img.src = url;
05     if (img.complete) {
06         callback(img.width, img.height);
07     } else {
08         img.onload = function () {
09             callback(img.width, img.height);
10             img.onload = null;
11         };
12     };
13  
14 };

可以看到上面必须等待图片加载完毕才能获取尺寸,其速度不敢恭维,我们需要改进。

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

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

当然实际中会有一些兼容陷阱,如width与height检测各个浏览器的不一致,还有webkit new Image()建立的图片会受以处在加载进程中同url图片影响,经过反复测试后的最佳处理方式:

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

调用例子:

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

是不是很简单?这样的方式获取摄影级别照片尺寸的速度往往是onload方式的几十多倍,而对于web普通(800×600内)浏览级别的图片能达到秒杀效果。看了这个再回忆一下你见过的web相册,是否绝大部分都可以重构一下呢?

js下载地址:

点击下载


wpf实现本地图像文件打开与保存 本资源为wpf demo,通过文件夹对话框实现本地路径的图像文件读取,以及本地路径的文件保存,小小程序,大神勿喷! 立即下载

相关推荐

《缠中说禅108课》5:市场无须分析,只要看和干

喜欢吹牛皮的,在市场里最常见,例如一种以分析市场、吹牛皮为生的职业,叫什么股评、专家的。此类人不过是市场上的寄生虫,真正的猎手只会观察、操作,用嘴是打不了豺狼的。 市场就是一个狩猎场,首先你要成为一个好猎手,而一个猎手,首先要习惯于无言。如果真有什么真理,那真理也是无言的。可言说的,都不过是人类思想的分泌物,臭气熏天。真不可言说了,就无不可言,言而无言,是乃真言。 一个好的猎手,可以没有嘴巴,但一定会有一双不为外物所动的眼睛,在这眼睛下,一切如幻化般透明。要不被外物所动,则首先要不被自我所迷惑,其实..

BenRen1314的博客 801

上传图片和得到图片长宽大小的方法

<br />上传|转换<form id="PicAdd" method="post" runat="server" enctype="multipart/form-data"><br />    <input type="file" runat="server" id="Pic" NAME="Pic"><br /></form><br />'++++++++++++++++++++++以下为读取代码<br />HttpPostedFile     UpFile=Pic.PostedFile;//读取数据<b

程序与人生 4844

IGBT模块封装中的银烧结技术:为什么特斯拉和比亚迪都在用这种黑科技?

本文深入解析了IGBT模块封装中的银烧结技术,揭示了其作为功率半导体封装工艺关键升级的原因。该技术通过低温烧结形成高熔点、高导热导电的银连接层,显著提升了模块的功率循环寿命、散热能力和高温工作稳定性,这正是特斯拉、比亚迪等行业巨头采用此项黑科技以释放电动汽车电驱系统极致性能的核心所在。

yhn4567890的博客 833

获取网络图片或本地图片的长宽的方法

获取网络图片或本地图片的长宽信息的方法

weixin_42235875的博客 1175

在Pycharm中配置Pyqt5工具(2023年新版教程)

在Pycharm中配置Pyqt5相关的三个工具:QtDesigner、PyUIC、PYRCC

网络技术和Python 2万+

逆向某团mtgsig参数时,我踩过的3个坑:从H5guard混淆到Python校验

本文详细解析了逆向某团mtgsig参数时遇到的三大挑战:H5guard混淆破解、环境补全检测与Python结果校验。通过实战案例,揭示了JavaScript加密算法的逆向技巧,包括控制流混淆拆解、隐蔽环境检测点规避以及跨语言校验的解决方案,为开发者提供了一套完整的逆向工程避坑指南。

weixin_27722377的博客 1062

html网页图片预加载,再谈javascript图片预加载技术

图片预加载技术的典型应用:如lightbox方式展现照片,无疑需要提前获得大图的尺寸,这样才能居中定位,由于javascript无法获取img文件头数据,必须等待其加载完毕后才能获取真实的大小然后展示出来,所以lightbox显示的图片的速度体验要比直接输出的差很多,而本文说提到的预加载技术主要针对获取图片尺寸。一段典型的使用预加载获取图片大小的例子:var imgLoad = function ...

weixin_39639286的博客 280

Android13配置selinux让system应用可读sys,proc,SN号

Android13预置的system应用,需要读/sys, /proc目录,读(SN)serial number号, 需要修改selinux配置,否则会报avc错.其修改方法会比Android11复杂一些.。

zmlovelx(帅得不敢出门 程序员群31843264) 2654

再谈javascript图片预加载经典技术

图片预加载技术的典型应用: 如lightbox方式展现照片,无疑需要提前获得大图的尺寸,这样才能居中定位,由于javascript无法获取img文件头数据,必须等待其加载完毕后才能获取真实的大小然后展示出来,所以lightbox显示的图片的速度体验要比直接输出的差很多,而本文说提到的预加载技术主要针对获取图片尺寸。 一段典型的使用预加载获取图片大小的例子: web应用程序区别于桌面应用...

weixin_34049032的博客 77

告别反复刷写:用英飞凌XCP Overlay功能实现ECU标定与诊断的‘热更新’

本文详细介绍了英飞凌XCP Overlay功能在ECU标定与诊断中的应用,实现参数的'热更新',避免反复刷写Flash。通过地址重映射技术,将标定变量从Flash重定向到RAM,显著提升工作效率并保护Flash寿命。文章涵盖技术原理、工程实践、功能安全考量及高级应用场景,为汽车电子工程师提供完整解决方案。

weixin_30689307的博客 527

Anki小白必看:手把手教你打造高颜值个性化笔记模板(附Leaflyer模板下载)

本文为Anki新手提供详细的个性化笔记模板设计指南,从基础配置到高级定制技巧,帮助用户打造高效记忆系统。特别推荐Leaflyer模板下载,通过视觉优化和功能强化,显著提升学习体验和记忆效率。

weixin_28717969的博客 433

智能家居空调线控器弱电接线与蓝牙调试标准化指南

在智能家居集成项目中,设备通信的物理层往往决定系统稳定性,空调线控器的RS485总线连接便是典型场景。RS485作为差分信号总线,其拓扑结构、线径选型、极性接法及屏蔽接地等弱电接线细节,直接影响通信质量与抗干扰能力。在工程实践中,标准化接线规则能有效规避极性反接、环路干扰等隐性故障。同时,借助蓝牙调试工具可大幅提升现场参数配置与故障排查效率,通过读版本、抄参数、备份、验证的四步流程,实现可复现、可追溯的调试路径。本文结合智能家居项目中的常见痛点,梳理从协议识别、物理层排障到蓝牙调试工具应用的完整技术方案,为

weixin_34268579的博客 199

车载软件架构 —— AUTOSAR Vector SIP包(三)

### 上一篇文章中介绍了AUTOSAR基础软件供应商Vector公司的开发工具链,本文将继续介绍Vector公司的AUTOSAR产品。 ### -> 1、Vector SIP包中的StartApplication ### -> 2、StartApplication如何开始使用

Soly_kun的博客 831
上一篇: 实现图片加载前显示loading之类
下一篇: 20行代码写小偷程序
HackProgramer
博客等级 码龄12年 255粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值