javascript图片预加载实例分析

本文介绍了一种JavaScript获取图片头数据的方法来实现更高效和准确的图片预加载,包括解决lightbox类效果中图片居中显示的挑战,以及提供一个改进的预加载函数,确保在全屏模式下图片加载更为流畅。此外,还讨论了如何在不同场景下调整预加载策略以提升用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文实例讲述了javascript图片预加载的方法。分享给大家供大家参考。具体如下:

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
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代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// 更新:
// 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);
     };
   };
})();

调用例子:

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

源引:http://www.jb51.net/article/69578.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值