解决获取图片实际尺寸(宽高)的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 ...
随机推荐
- sql 中sum函数返回null的解决方案
SUM 是SQL语句中的标准求和函数,如果没有符合条件的记录,那么SUM函数会返回NULL. 但多数情况下,我们希望如果没有符合条件记录的情况下,我们希望它返回0,而不是NULL,那么我们可以使用例如 ...
- 什么是static?什么是final?
由static修饰的变量.常量.和方法被称为是静态变量.常量和 方法. 静态数据和静态方法的作用通常是为了提供共享数据或方法,如数学计算公式等,以static声明并且实现,这样当需要使用时,直接使用类 ...
- (转)关于block使用的5点注意事项
1.在使用block前需要对block指针做判空处理. 不判空直接使用,一旦指针为空直接产生崩溃. if (!self.isOnlyNet) { if (succBlock == NULL) { // ...
- Android提示框与通知的使用
1.通知 Android 3.0以前使用的方法 NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION ...
- 008.C++类改写模板类
1.普通类 //class head class complex //class body {} { public: complex(, double i) :re(r), im(i) {}//构造函 ...
- Qt error ------ 出现Error - RtlWerpReportException failed with status code :-1073741823. Will try to launch the process directly
出现原因: 使用了不存在的对象 数组越界了 用 delete 释放未分配的内存空间,或者超过一次释放同个内存 比如: 顺序不能颠倒 正确: ui->setupUi(this); ui->t ...
- 神经网络CNN训练心得--调参经验
1.样本要随机化,防止大数据淹没小数据 2.样本要做归一化.关于归一化的好处请参考:为何需要归一化处理3.激活函数要视样本输入选择(多层神经网络一般使用relu)4.mini batch很重要,几百是 ...
- uboot启动原理
1.裸机运行程序时一般情况下程序代码小于16KB将其下载地址设置到BL1的起始地址.BL0会自动加载并执行BL1. 当程序大于16kB时无法直接运行. 例如UBOOT就大于16KB,执行的原理为.将程 ...
- ZooKeeper Java例子(六)
A Simple Watch Client 为了向你介绍ZooKeeper Java API,我们开发了一个非常简单的监视器客户端.ZooKeeper客户端监视一个ZooKeeper节点的改变并且通过 ...
- CentOS安装JDK环境
一:查看当前系统的java环境 [elsearch@localhost data]$ rpm -qa | grep jdk 二:卸载原有的jdk [elsearch@localhost /]$ yum ...