`
axl234
  • 浏览: 273649 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

比onload更快获取图片尺寸

阅读更多

比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图片影响,经过反复测试后的最佳处理方式:

 

/**
 * 图片头数据加载就绪事件 - 更快获取图片尺寸
 * @version	2011.05.27
 * @author	TangBin
 * @see		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);
		};
	};
})();
调用例子:
2     alert('size ready: width=' + this.width + '; height=' + this.height);
3 });
分享到:
评论

相关推荐

    JavaScript获取图片真实大小代码实例

    在图片未完全加载之前,浏览器并不知道其真实尺寸,因此`onload`是获取图片尺寸的正确时机。 接着,内容部分展示了具体的代码示例。这段代码首先使用jQuery选择器`$("#img_id")`获取页面上的图片元素。之后,通过...

    js获取图片宽高的方法

    定时器检测的方法比onload事件触发更快,因为它不依赖于图片加载完成的事件。 5. 避免缓存影响 为了避免浏览器缓存对尺寸检测的影响,可以在图片的URL后附加时间戳或其他唯一标识符。示例如下: ```javascript var ...

    IE浏览器中图片onload事件无效的解决方法

    此外,Firefox等浏览器在检测到缓冲区已有图片时会直接触发`onload`事件,展示了更智能的行为。因此,编写跨浏览器兼容的代码时,对这些差异要有充分的认识,以确保代码在各种环境下都能正确运行。

    JS中通过url动态获取图片大小的方法小结(两种方法)

    下面,我们将探讨两种通过URL动态获取图片尺寸的方法。 1. 预加载获取图片大小 这种方法使用`Image`对象的`onload`事件来监听图片加载完成,然后回调函数中获取图片的宽度和高度。代码如下: ```javascript var ...

    jQuery ready()和onload的加载耗时分析

    因此,jQuery的document.ready()由于其执行速度较快,通常比传统的window.onload更适合用于初始化页面时的脚本执行。然而,window.onload也有它的独特用途,主要是在页面所有资源加载完成后再执行某些操作,比如绑定...

    JS实现图片预加载无需等待

    如果图片已经缓存,那么再次请求相同URL的图片时,浏览器并不会触发onload事件,而是直接从缓存中读取,导致无法获取图片尺寸。为了解决这一问题,代码中加入了一个判断——检查Image对象的complete属性。该属性表示...

    JavaScript超酷图片效果源代码

    4. **图像加载**:JavaScript可以监控图片的加载状态,通过`onload`事件确保图片完全加载后再执行其他操作,比如调整图片尺寸或显示图片容器。 5. **AJAX异步加载**:对于大型图片集,可以使用AJAX异步加载技术,只...

    JavaScript图片特效类

    在响应式设计中,JavaScript可以帮助调整图片尺寸以适应不同设备和屏幕分辨率。例如,可以使用window对象的resize事件和图片的naturalWidth和naturalHeight属性。 以上就是JavaScript图片特效的一些核心知识点。在...

    jQuery获取file控件中图片的宽高与大小

    其中一个常见的应用场景是在用户上传图片之前获取图片的尺寸和文件大小,以确保上传的图片符合网站的要求。本文将详细介绍如何使用 jQuery 获取 file 控件中选定的图片文件的尺寸和大小。 在传统的 HTML 表单中,...

    asp正则获取html文件图片地址

    2. **移除HTML中的事件处理程序**:通过正则表达式删除所有的`onclick`、`onload`等事件,避免这些内容干扰图片地址的提取。 3. **提取包含图片地址的标签**:使用两种不同的正则表达式模式来匹配`&lt;img&gt;`标签,并...

    图片放大,js放大图片

    // 设置canvas尺寸为放大后的图片尺寸 canvas.width = img.width * 2; canvas.height = img.height * 2; // 使用双线性插值放大图片 ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, ...

    微信小程序图片瀑布流布局demo

    在`onLoad`事件中,我们可以获取到图片的实际宽度和高度,然后根据这些信息计算出图片在瀑布流中的高度。 ```javascript Page({ ... onLoad: function(e) { var query = wx.createSelectorQuery().in(this); ...

    mui图片上传和压缩

    3. **压缩比例**:为了控制压缩程度,可以在设置Canvas尺寸时,根据原始图片的尺寸和期望的最大尺寸计算出缩放比例。 三、Mui的集成 Mui虽然主要关注移动端的UI,但在处理图片上传和压缩时,更多的是依赖于HTML5的...

    Jquery实例--图片预加载

    图片预加载的核心在于,在图片实际显示之前,提前发起请求获取图片数据。这样当用户滚动到相应位置或点击按钮显示图片时,图片已经存在于浏览器的缓存中,可以立即展示,提高了页面的响应速度。 以下是一个基本的...

    微信小程序图片缩放移动代码

    // 获取图片原始尺寸 wx.getImageInfo({ src: this.data.imageSrc, success: res =&gt; { this.setData({ imgOriginalWidth: res.width, imgOriginalHeight: res.height, }); }, }); }, onDoubleTap: ...

    微信小程序:图片展示行业多个源代码.rar

    例如,在页面加载时获取图片数据,在页面隐藏时释放相关资源。 5. **网络请求** 如果图片数据来源于网络,开发者需要使用wx.request()方法进行异步请求。在响应成功后,可以将图片URL保存到数据对象中,进而更新到...

    FancyZoom点击图片实现放大

    同时,需要确保图片的源文件已经准备好,包括原始尺寸和缩略图尺寸。 使用FancyZoom的基本步骤如下: 1. 在HTML中,为需要放大的图片添加`&lt;a&gt;`标签,并指定`href`属性为大图的URL。例如: ```html ``` 2....

    As+lightbox+js加载图片进度

    例如,不是所有浏览器都支持`Content-Length`,对于不支持的浏览器,可能需要通过其他方式获取图片大小。同时,频繁的进度更新也可能会影响性能,需要合理控制更新频率。 综上所述,"As Lightbox + js 加载图片进度...

    canvas压缩图片并展示缩略图

    要使用Canvas压缩图片,我们首先要创建一个`&lt;canvas&gt;`元素,并获取其`2D渲染上下文`,这是进行绘图操作的基础。 ```html &lt;canvas id="imageCanvas"&gt;&lt;/canvas&gt; ``` ```javascript const canvas = document....

Global site tag (gtag.js) - Google Analytics