解决获取图片实际尺寸(宽高)的bug
需求:获取图片的宽高其实是为了预先做好排版样式布局做准备。
可以利用图片onload事件监听获取图片的宽高属性值。在IE9以下版本只能使用图片的width与height属性,HTMl5中新加入了naturalHeight与naturalWidth属性,用来标记图片的实际尺寸。 代码如下:
//图片地址
var imgSrc = 'https://farm4.staticflickr.com/3530/3273073729_4cc8a5c665_z.jpg?zz=1'; var img = new Image();
img.onload = function(){
console.log('img onload'); if ( typeof img.naturalWidth != 'undefined') {
originalImgW = img.naturalWidth;
originalImgH = img.naturalHeight;
console.log('natural -> ', originalImgH, '~~', originalImgW);
} else {
13 originalImgW = img.width;
14 originalImgH = img.height;
15 console.log('IE8 -> ', originalImgH, '~~', originalImgW);
}
} img.src = imgSrc;
但是,在实际项目中使用上述代码却出现了bug.
当浏览器为IE8,并且开启了IE8兼容模式后,在无缓存的情况下,img.width 与 img.height属性获取的值为0,缓存后width与height属性值正常。
在浏览器IE8,不开启IE8兼容模式,关闭浏览器缓存,上述现象几率性出现。
根据现象分析,图片如果缓存了,就可以正确获取图片的尺寸,因此是否可以在无缓存时加载两次图片,获取第二次的尺寸。
将代码更改如下:
//图片地址
var imgSrc = 'https://farm4.staticflickr.com/3530/3273073729_4cc8a5c665_z.jpg?zz=1'; var img = new Image(); img.onload = function(){
console.log('img onload'); if ( typeof img.naturalWidth != 'undefined') {
originalImgW = img.naturalWidth;
originalImgH = img.naturalHeight;
console.log('natural -> ', originalImgH, '~~', originalImgW);
} else {
var img4Fix = new Image();
img4Fix.src = imgSrc;
originalImgW = img4Fix.width;
originalImgH = img4Fix.height;
console.log('IE8 with fix -> ', originalImgH, '~~', originalImgW);
}
} img.src = imgSrc;
当img图片onload后,缓存中其实已经有了图片文件。
img4Fix 向同一个地址请求图片,浏览器判断该地址已经存在缓存中,则不再向服务器发送请求,是从缓存中获取图片,获取的缓存图片的尺寸是正确的。
由于第二次请求同一个图片不再向服务器发送请求,所以也无需再监听img4Fix的onload事件。
解决获取图片实际尺寸(宽高)的bug的更多相关文章
- js判断图片加载完成后获取图片实际宽高
通常,我们会用jq的.width()/.height()方法获取图片的宽度/高度或者用js的.offsetwidth/.offsetheight方法来获取图片的宽度/高度,但这些方法在我们通过样式设置 ...
- RT/Metro商店应用如何如何获取图片的宽高
RT/Metro商店应用如何如何获取图片的宽高 var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms ...
- JS获取图片实际宽高及根据图片大小进行自适应
JS获取图片实际宽高,以及根据图片大小进行自适应 <img src="http://xxx.jpg" id="imgs" onload="ad ...
- JS获取图片实际宽高
JS获取图片实际宽高,以及根据图片大小进行自适应 <img src="http://xxx.jpg" id="imgs" onload="ada ...
- 根据图片url地址获取图片的宽高
/** * 根据img获取图片的宽高 * @param img 图片地址 * @return 图片的对象,对象中图片的真实宽高 */ public BufferedImage getBufferedI ...
- Js获取图片原始宽高
如果我们页面看到的图片都是缩略图,那就需要做个图片点击放大效果,那么怎样获取图片的原始宽高呢?方法如下: //获取图片原始宽度 function getNaturalWidthAndHeight(im ...
- Android 获取图片真实宽高
Resources res = mContext.getResources(); BitmapFactory.Options opts = new BitmapFactory.Options(); o ...
- UIImageView 获取图片的 宽 高
该文章纯属这两天开发的经验之谈 并且也是平常没注意 这回发现的一个小方法 并且很实用 在开发中 提高了很大的效率 更加符合高保真的要求 通常 美术 切的一些图片 需要 :1还原的 现在 我们一般支持i ...
- html5获取图片的宽高
var fr = new FileReader; fr.readAsDataURL($("#inputFileId").files[0]); fr.onload = functio ...
随机推荐
- 题解【luoguP1351 NOIp提高组2014 联合权值】
题目链接 题意:给定一个无根树,每个点有一个权值.若两个点 \(i,j\) 之间距离为\(2\),则有联合权值 \(w_i \times w_j\).求所有的联合权值的和与最大值 分析: 暴力求,每个 ...
- bzoj 1218 [HNOI2003]激光炸弹 二维前缀和
[HNOI2003]激光炸弹 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3022 Solved: 1382[Submit][Status][Di ...
- 在IAR使用FreeRTOS出现Error[Pa045]: function "XXX" has no prototype
FreeRTOS官方例程中设置了需要“Require prototype”,所以每个函数(除了main函数)都需要函数声明,其中对于无形参的函数声明要加void,比如void led_init(voi ...
- CodeBlocks wrong
codeblocks官网 Q1. 中文乱码 系统是win,用的是codeblocks编辑器,指定的原文件编码是UTF-8 编译后运行,发现中文在控制台里显示全是乱码 A1: 对此有解决办法,通过给g+ ...
- android抽屉导航的设计准则
我阅读了google官方的关于抽屉导航的设计准则,这可以给我带来什么帮助?最起码,我可以知道,抽屉导航适用在什么场景中,使用它时要注意什么事项.App的设计是有规则可以依据的,比如,使用抽屉导航时,是 ...
- 【poj1222-又一道开关问题】高斯消元求解异或方程组
题意:给出一个5*6的图,每个灯泡有一个初始状态,1表示亮,0表示灭.每对一个灯泡操作时,会影响周围的灯泡改变亮灭,问如何操作可以使得所有灯泡都关掉. 题解: 这题和上一题几乎完全一样..就是要输出解 ...
- 01-QQ 3-最终重构版
Demo示例程序源代码
源代码下载链接:01-QQ 3.zip292.5 KB // QQAppDelegate.h Map // // QQAppDelegate.h // 01-QQ // // Created ...
- 01背包入门 dp
题目引入: 有n个重量和价值分别为Wi,Vi的物品.从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中的价值总和的最大值. 分析: 首先,我们用最普通的方法,针对每个物品是否放入背包进行搜索. ...
- bzoj 1052 dfs
首先可以二分答案,将最优性问题转化为判定性问题. 对于二分到的边长,我们可以把所有的点看成一个大的矩形,这个矩形为包括所有点的最小矩形,那么贪心的想,3个正方形,第一个肯定放在这个矩形其中的一角,然后 ...
- adb操作指令大全
adb是什么?:adb的全称为Android Debug Bridge,就是起到调试桥的作用.通过adb我们可以在Eclipse中方面通过DDMS来调试android程序,说白了就是debug工具.a ...