js获取图片宽高的方法


Posted in Javascript onNovember 25, 2015

本文分享多种js获取图片宽高的方法,并且通过实例进行分析,希望大家从中有所收获。

一、简陋的获取图片方式

// 图片地址 后面加时间戳是为了避免缓存
var img_url = ‘upload/2013/13643608813441.jpg?'+Date.parse(new Date());
 
// 创建对象
var img = new Image();
 
// 改变图片的src
img.src = img_url;
 
// 打印
alert('width:'+img.width+',height:'+img.height);

 结果如下:

js获取图片宽高的方法

宽高都是0的这个结果很正常,因为图片的相关数据都没有被加载前它的宽高默认就是0 于是可以这么优化!

二、onload后在打印

// 图片地址 后面加时间戳是为了避免缓存
var img_url = 'upload/2013/13643608813441.jpg?'+Date.parse(new Date());
 
// 创建对象
var img = new Image();
 
// 改变图片的src
img.src = img_url;
 
// 加载完成执行
img.onload = function(){
 // 打印
 alert('width:'+img.width+',height:'+img.height);
};

 结果如下

js获取图片宽高的方法

通过onload就能获取到图片的宽高了。但onload大一点的图通常都比较慢,不实用,但只要图片被浏览器缓存,那么图片加载几乎就不用等待即可触发onload,我们要的是占位符。所以有些人通过缓存获取也可以这么写。

三、通过complete与onload一起混合使用
为了测试缓存效果,注意以下测试图片的url都不加时间戳

// 图片地址
var img_url = 'upload/2013/13643608813441.jpg';
 
// 创建对象
var img = new Image();
 
// 改变图片的src
img.src = img_url;
 
// 判断是否有缓存
if(img.complete){
 // 打印
 alert('from:complete : width:'+img.width+',height:'+img.height);
}else{
 // 加载完成执行
 img.onload = function(){
 // 打印
 alert('from:onload : width:'+img.width+',height:'+img.height);
 };
}

 第一次执行,永远是onload触发

js获取图片宽高的方法

你再刷新,几乎都是缓存触发

js获取图片宽高的方法

从缓存里读取图片的宽高不用说,非常方便快捷,今天我们要解决的是没有缓存而又快速的相比onload更快的方式去获取图片的宽高。我们常常知道有些图片虽然没有完全down下来,但是已经先有占位符,然后一点一点的加载。既然有占位符那应该是请求图片资源服务器响应后返回的。可服务器什么时候响应并返回宽高的数据没有触发事件,比如onload事件。于是催生了第四种方法

四、通过定时循环检测获取
看看以下例子,为了避免从缓存里读取数据,每一次请求都带时间戳:

// 图片地址
var img_url = 'upload/2013/13643608813441.jpg?'+Date.parse(new Date());
 
// 创建对象
var img = new Image();
 
// 改变图片的src
img.src = img_url;
 
// 定时执行获取宽高
var check = function(){
 document.body.innerHTML += '
from:check : width:'+img.width+',height:'+img.height+'
';
};
 
var set = setInterval(check,40);
 
// 加载完成获取宽高
img.onload = function(){
 document.body.innerHTML += '
from:onload : width:'+img.width+',height:'+img.height+'
';
 
 // 取消定时获取宽高
 clearInterval(set);
};

 FireFox

js获取图片宽高的方法

IE7 8 9 10

js获取图片宽高的方法

Chrome

js获取图片宽高的方法

通过以上测试,我们发现定时检测图片宽高的方式要比onload快多了,打印的行数越多表示onload时间越长,40毫秒执行一次,基本100毫秒内就能获取图片的宽高,chrome甚至在第一次循环的时候就已经获得数据。从以上数据来分析,其实我们可以在定时函数里判断只要图片的宽高都大于0就表示已经获得正确的图片宽高。我们把时间打上,来看看通过定时获取宽高或者onload获取宽高所需要多少时间。

// 记录当前时间戳
var start_time = new Date().getTime();
 
// 图片地址
var img_url = 'http://b.zol-img.com.cn/desk/bizhi/image/2/2560x1600/1365477614755.jpg?'+start_time;
 
// 创建对象
var img = new Image();
 
// 改变图片的src
img.src = img_url;
 
// 定时执行获取宽高
var check = function(){
 // 只要任何一方大于0
 // 表示已经服务器已经返回宽高
 if(img.width>0 || img.height>0){
 var diff = new Date().getTime() - start_time;
 document.body.innerHTML += '
from:check : width:'+img.width+',height:'+img.height+', time:'+diff+'ms
';
 clearInterval(set);
 }
};
 
var set = setInterval(check,40);
 
// 加载完成获取宽高
img.onload = function(){
 var diff = new Date().getTime() - start_time;
 document.body.innerHTML += 'from:onload : width:'+img.width+',height:'+img.height+', time:'+diff+'ms';
};

 FireFox:

js获取图片宽高的方法

IE

js获取图片宽高的方法

Chrome

js获取图片宽高的方法

这是一张2560 * 1600大小的图片,各浏览器执行结果都能看到通过快速获取图片大小的方法几乎都在200毫秒以内,而onload至少五秒以上,这差别之大说明快速获取图片宽高非常实用。

通过大量实例分析比较了js获取图片宽高各种方法的优劣,希望大家根据需要认真取舍。

Javascript 相关文章推荐
IE8下关于querySelectorAll()的问题
May 13 Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
Dec 27 Javascript
用javascript为页面添加天气显示实现思路及代码
Dec 02 Javascript
JQuery实现鼠标移动到图片上显示边框效果
Jan 09 Javascript
jQuery on()绑定动态元素出现的问题小结
Feb 19 Javascript
javascript中arguments,callee,caller详解
Mar 16 Javascript
最实用的jQuery分页插件
Oct 09 Javascript
原生js+cookie实现购物车功能的方法分析
Dec 21 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
Feb 20 Javascript
layer设置maxWidth及maxHeight解决方案
Jul 26 Javascript
layui type2 通过url给iframe子页面传值的例子
Sep 06 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
Nov 05 Javascript
javascript数据结构之二叉搜索树实现方法
Nov 25 #Javascript
javascript常用经典算法实例详解
Nov 25 #Javascript
javascript实现很浪漫的气泡冒出特效
Sep 05 #Javascript
jQuery插件jquery-barcode实现条码打印的方法
Nov 25 #Javascript
JavaScript编写简单的计算器
Nov 25 #Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
Nov 25 #Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
Nov 25 #Javascript
You might like
无数据库的详细域名查询程序PHP版(5)
2006/10/09 PHP
Apache2 httpd.conf 中文版
2006/12/06 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
2013/06/25 PHP
在wamp集成环境下升级php版本(实现方法)
2013/07/01 PHP
php mb_substr()函数截取中文字符串应用示例
2014/07/29 PHP
yii2学习教程之5种内置行为类详解
2017/08/03 PHP
jquery 可拖拽的窗体控件实现代码
2010/03/21 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
理解AngularJs指令
2015/12/10 Javascript
JavaScript中setter和getter方法介绍
2016/07/11 Javascript
微信小程序 封装http请求实例详解
2017/01/16 Javascript
vue实现登陆登出的实现示例
2017/09/15 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
2018/12/24 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
2019/01/29 Javascript
vue-cli3+typescript新建一个项目的思路分析
2019/08/06 Javascript
Layui 解决表格异步调用后台分页的问题
2019/10/26 Javascript
vue中axios封装使用的完整教程
2021/03/03 Vue.js
Python遍历文件夹和读写文件的实现方法
2017/05/10 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
2017/07/11 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
python按比例随机切分数据的实现
2019/07/11 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
元宵节主持词
2014/03/25 职场文书
《云房子》教学反思
2014/04/20 职场文书
医院我们的节日活动实施方案
2014/08/22 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
2014年残联工作总结
2014/11/21 职场文书
龙潭大峡谷导游词
2015/02/10 职场文书
童年读书笔记
2015/06/26 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书
SQL Server2019数据库之简单子查询的具有方法
2021/04/27 SQL Server