- 浏览: 273649 次
- 性别:
- 来自: 北京
-
最新评论
-
haixin3036:
jQuery是一套跨浏览器的JavaScript库,简化HTM ...
jquery sizzle 选择器浅析 -
panshunchang:
非常感谢分享,正找这东西呢。
基于jQuery的QQ表情插件 -
yuur369:
不错。。。
移动端webapp开发必备知识
比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); }; }; })();
调用例子:
1 |
imgReady( 'http://www.google.com.hk/intl/zh-CN/images/logo_cn.png' , function () {
|
2 |
alert( 'size ready: width=' + this .width + '; height=' + this .height);
|
3 |
}); |
发表评论
-
在JavaScript中应用单例模式管理命名空间
2014-05-28 10:56 849单例模式确保一个类在整个应用程序中只有一个是实例对象,在J ... -
移动WEB开发中媒体查询里的width, device-width, resolution
2014-05-28 10:14 1053/*1、width: viewport的宽度,css像素,三星 ... -
前端性能优化
2014-05-27 15:16 9391. 请减少HTTP请求 基本原理: ... -
jquery sizzle 选择器浅析
2014-05-26 14:23 1269看了jquery的源码,jquery用的选择器的引擎是siz ... -
jQuery 1.8,1.9和2.0分别带来的新特性
2014-05-26 14:17 1428jQuery 1.8 可定制 在jQuery ... -
jquery点击div之外的地方div本身消失
2014-05-15 12:22 930<!DOCTYPE html PUBLIC " ... -
jquery-migrate: 迁移旧的jQuery代码至jQuery1.9以上的版本
2014-05-14 16:31 728这个插件可以用来检测和恢复在jQuery1.9版本中已删除或 ... -
移动WEB在线开发工具 – Codiqa
2014-05-12 15:43 716Codiqa,https://codiqa.com 简单试用 ... -
jQuery反向排序(倒序)子对象
2013-12-26 10:53 2345<!DOCTYPE html><html&g ... -
js object写法 参数传递jquery对象
2013-12-24 11:21 978<!DOCTYPE HTML PUBLIC &quo ... -
JavaScript模拟QQ签名(HTML5 contenteditable属性)
2013-12-24 11:08 643一、思路 1、单击元素时,使元素可以编辑,并获得焦点 2 ... -
jquery 方块转盘 得 ###jiang####品
2013-12-02 14:42 651<!DOCTYPE html PUBLIC " ... -
检测用户是否连续输入减少ajax请求次数
2013-11-07 10:43 903<!DOCTYPE HTML PUBLIC " ... -
JavaScript模拟QQ签名(HTML5 contenteditable属性)
2013-11-05 15:51 614<!doctype html><html&g ... -
resize和scroll事件的优化,防止浏览器死掉
2013-07-30 10:51 756原理是利用setTimeout让resize事件和scrol ... -
javascript中apply和call的用法和区别
2013-07-30 10:12 6581.apply和call的区别在哪 ... -
让IE支持CSS3 Media Query实现响应式Web设计
2013-07-30 10:11 717如今的屏幕分辨率,小至320px(iPhone),大到2560 ... -
JSON对象和字符串之间的相互转换(包括兼容办法)
2013-07-18 17:29 765现在JSON对象用在ajax中越来越普遍了,实际项目中经常涉 ... -
基于HTML5的可预览多图片Ajax上传
2013-07-18 14:20 1345核心骨架脚本简单剖析 首先是文件上传的一个core文件,是 ... -
webkit webApp 开发技术要点
2013-07-18 14:17 7981. viewport:可视区域 对于桌面浏览器,我们都很 ...
相关推荐
在图片未完全加载之前,浏览器并不知道其真实尺寸,因此`onload`是获取图片尺寸的正确时机。 接着,内容部分展示了具体的代码示例。这段代码首先使用jQuery选择器`$("#img_id")`获取页面上的图片元素。之后,通过...
定时器检测的方法比onload事件触发更快,因为它不依赖于图片加载完成的事件。 5. 避免缓存影响 为了避免浏览器缓存对尺寸检测的影响,可以在图片的URL后附加时间戳或其他唯一标识符。示例如下: ```javascript var ...
此外,Firefox等浏览器在检测到缓冲区已有图片时会直接触发`onload`事件,展示了更智能的行为。因此,编写跨浏览器兼容的代码时,对这些差异要有充分的认识,以确保代码在各种环境下都能正确运行。
下面,我们将探讨两种通过URL动态获取图片尺寸的方法。 1. 预加载获取图片大小 这种方法使用`Image`对象的`onload`事件来监听图片加载完成,然后回调函数中获取图片的宽度和高度。代码如下: ```javascript var ...
因此,jQuery的document.ready()由于其执行速度较快,通常比传统的window.onload更适合用于初始化页面时的脚本执行。然而,window.onload也有它的独特用途,主要是在页面所有资源加载完成后再执行某些操作,比如绑定...
如果图片已经缓存,那么再次请求相同URL的图片时,浏览器并不会触发onload事件,而是直接从缓存中读取,导致无法获取图片尺寸。为了解决这一问题,代码中加入了一个判断——检查Image对象的complete属性。该属性表示...
4. **图像加载**:JavaScript可以监控图片的加载状态,通过`onload`事件确保图片完全加载后再执行其他操作,比如调整图片尺寸或显示图片容器。 5. **AJAX异步加载**:对于大型图片集,可以使用AJAX异步加载技术,只...
在响应式设计中,JavaScript可以帮助调整图片尺寸以适应不同设备和屏幕分辨率。例如,可以使用window对象的resize事件和图片的naturalWidth和naturalHeight属性。 以上就是JavaScript图片特效的一些核心知识点。在...
其中一个常见的应用场景是在用户上传图片之前获取图片的尺寸和文件大小,以确保上传的图片符合网站的要求。本文将详细介绍如何使用 jQuery 获取 file 控件中选定的图片文件的尺寸和大小。 在传统的 HTML 表单中,...
2. **移除HTML中的事件处理程序**:通过正则表达式删除所有的`onclick`、`onload`等事件,避免这些内容干扰图片地址的提取。 3. **提取包含图片地址的标签**:使用两种不同的正则表达式模式来匹配`<img>`标签,并...
// 设置canvas尺寸为放大后的图片尺寸 canvas.width = img.width * 2; canvas.height = img.height * 2; // 使用双线性插值放大图片 ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, ...
在`onLoad`事件中,我们可以获取到图片的实际宽度和高度,然后根据这些信息计算出图片在瀑布流中的高度。 ```javascript Page({ ... onLoad: function(e) { var query = wx.createSelectorQuery().in(this); ...
3. **压缩比例**:为了控制压缩程度,可以在设置Canvas尺寸时,根据原始图片的尺寸和期望的最大尺寸计算出缩放比例。 三、Mui的集成 Mui虽然主要关注移动端的UI,但在处理图片上传和压缩时,更多的是依赖于HTML5的...
图片预加载的核心在于,在图片实际显示之前,提前发起请求获取图片数据。这样当用户滚动到相应位置或点击按钮显示图片时,图片已经存在于浏览器的缓存中,可以立即展示,提高了页面的响应速度。 以下是一个基本的...
// 获取图片原始尺寸 wx.getImageInfo({ src: this.data.imageSrc, success: res => { this.setData({ imgOriginalWidth: res.width, imgOriginalHeight: res.height, }); }, }); }, onDoubleTap: ...
例如,在页面加载时获取图片数据,在页面隐藏时释放相关资源。 5. **网络请求** 如果图片数据来源于网络,开发者需要使用wx.request()方法进行异步请求。在响应成功后,可以将图片URL保存到数据对象中,进而更新到...
同时,需要确保图片的源文件已经准备好,包括原始尺寸和缩略图尺寸。 使用FancyZoom的基本步骤如下: 1. 在HTML中,为需要放大的图片添加`<a>`标签,并指定`href`属性为大图的URL。例如: ```html ``` 2....
例如,不是所有浏览器都支持`Content-Length`,对于不支持的浏览器,可能需要通过其他方式获取图片大小。同时,频繁的进度更新也可能会影响性能,需要合理控制更新频率。 综上所述,"As Lightbox + js 加载图片进度...
要使用Canvas压缩图片,我们首先要创建一个`<canvas>`元素,并获取其`2D渲染上下文`,这是进行绘图操作的基础。 ```html <canvas id="imageCanvas"></canvas> ``` ```javascript const canvas = document....