解决获取图片实际尺寸(宽高)的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 ...
随机推荐
- Connections between cities LCA
Problem Description After World War X, a lot of cities have been seriously damaged, and we need to r ...
- TCP/UDP HTTP
TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据.关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只 ...
- log4j输出到数据库(输出自定义参数、分级保存)
转载自:http://wallimn.iteye.com/blog/1525819 Log4J日志输出到数据库中,且保存些用户自定义的参数,如用户ID,且配置仅输出指定级别的日志. 配置文件如下: ...
- 动态规划:LIS
题目中的严格二字,表示的意思是不允许≥或者是≤的情况出现,只允许>的情况以及<的情况 经典问题是NOIP合唱队形,在这个题目中,既求了最长上升子序列,也求了最长下降子序列 其最终的结果由两 ...
- 记一次rsync日志报错directory has vanished
中午两点的时候邮件告知rsync同部svn源库失败,看rsync日志报错显示如上,当时还在上课,没在公司,怀疑是不是有人动了svn的版本库,后来询问同事并通过vpn登录服务器上查看版本库是正常的,也没 ...
- PHP网页架站
目前,Windows下已经有集成的PHP网页架站工具,例如:AppServ.WampServer.这些软件将Apache.PHP.MySQL.phpMyAdmin集成到一起,极大地方便了开发者架站.但 ...
- Vs2013 agent 安装
1. 在windows 2008 R2上安装vs2013 agents需要满足: 1) .net 3.5 2) sp1补丁包(同windows7 sp1) 2. 安装vs2013 agents 步骤如 ...
- bzoj 1452: [JSOI2009]Count ——二维树状数组
escription Input Output Sample Input Sample Output 1 2 HINT ———————————————————————————————————————— ...
- 【51NOD-0】1089 最长回文子串 V2(Manacher算法)
[算法]回文树 #include<cstdio> #include<algorithm> #include<cstring> using namespace std ...
- Achain 钱包部署
官网 GIT: [ Achain_linux ] 基础环境 OS: CentOS, Ubuntu Achain: 官网 [ release 最新版本 ] 安装 Achain 钱包 下载 CentOS ...