JS中通过url动态获取图片大小的方法小结(两种方法)


Posted in Javascript onOctober 31, 2018

很多时候再项目中,我们往往需要先获取图片的大小再加载图片,但是某些特定场景,如用过cocos2d-js的人都知道,在它那里只能按比例缩放大小,是无法设置指定大小的图片的,这就是cocos2d-js 的坑了,我们必须先获取图片大小,计算比例再对图片进行缩放。

查阅资料,我总结了两种通过url获取图片大小的方法:

1.预加载获取图片大小

var imgLoad = function (url, callback) {
  var img = new Image();
  img.src = url;
  if (img.complete) {
    callback(img.width, img.height);
  } else {
    img.onload = function () {
      callback(img.width, img.height);
      img.onload = null;
    };
  };
};

此方法必须等待图片加载完毕才能获取尺寸,速度超慢,图片会先出现原本大小,一段时间后才进行缩放,体验差

2.封装的方法imgReady

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);
    };
  };
})();

方法调用:

imgReady('http://www.google.com.hk/intl/zh-CN/images/logo_cn.png', function () {
  alert('size ready: width=' + this.width + '; height=' + this.height);
});

方法二体验下好很多,速度也很快,建议使用。

总结

以上所述是小编给大家介绍的JS中通过url动态获取图片大小的方法小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript异步调用定时方法并停止该方法实现代码
Mar 16 Javascript
js动态创建、删除表格示例代码
Aug 07 Javascript
jquery跟js初始化加载的多种方法及区别介绍
Apr 02 Javascript
js获取元素相对窗口位置的实现代码
Sep 28 Javascript
浅谈js的html元素的父节点,子节点
Aug 06 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
Aug 24 Javascript
值得学习的bootstrap fileinput文件上传工具
Nov 08 Javascript
jQuery插件echarts实现的多柱子柱状图效果示例【附demo源码下载】
Mar 04 Javascript
ES6中Math对象新增的方法实例详解
Apr 25 Javascript
Javascript实现倒计时时差效果
May 18 Javascript
vue数据初始化initState的实例详解
Apr 11 Javascript
详解vue-router的导航钩子(导航守卫)
Nov 02 Javascript
微信小程序实现留言功能
Oct 31 #Javascript
微信小程序签到功能
Oct 31 #Javascript
vue+element-ui实现表格编辑的三种实现方式
Oct 31 #Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
Oct 31 #Javascript
微信小程序实现签到功能
Oct 31 #Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
Oct 31 #Javascript
微信小程序实现自动定位功能
Oct 31 #Javascript
You might like
PHP+MySQL插入操作实例
2015/01/21 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
2016/11/14 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
2018/09/18 PHP
PHP中检查isset()和!empty()函数的必要性
2019/02/13 PHP
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
javascript页面动态显示时间变化示例代码
2013/12/18 Javascript
JavaScript函数柯里化详解
2016/04/29 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
微信小程序链接传参并跳转新页面
2016/11/29 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
JS排序之选择排序详解
2017/04/08 Javascript
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
微信小程序 this.triggerEvent()的具体使用
2019/12/10 Javascript
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
Python实现生成密码字典的方法示例
2019/09/02 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
世界上最大的二手相机店:KEN
2017/05/17 全球购物
美国CVS药店官网:CVS Pharmacy
2018/07/26 全球购物
俄语翻译实习生的自我评价分享
2013/11/06 职场文书
总裁岗位职责
2013/12/04 职场文书
鲜花方阵解说词
2014/02/13 职场文书
市级文明单位申报材料
2014/05/07 职场文书
大学生简历求职信
2014/06/24 职场文书
工作作风建设心得体会
2014/10/22 职场文书
2014最新股权信托合同协议书
2014/11/18 职场文书
暂停营业通知
2015/04/25 职场文书
详细谈谈MYSQL中的COLLATE是什么
2021/06/11 MySQL
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript