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 相关文章推荐
jquery中动态效果小结
Dec 16 Javascript
jquery+ajax实现注册实时验证实例详解
Dec 08 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
Feb 02 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
Aug 01 Javascript
jQuery继承extend用法详解
Oct 10 Javascript
js下拉菜单生成器dropMenu使用方法详解
Aug 01 Javascript
Vue组件之Tooltip的示例代码
Oct 18 Javascript
Vue 过滤器filters及基本用法
Dec 26 Javascript
在create-react-app中使用css modules的示例代码
Jul 31 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
Apr 17 Javascript
通过vue手动封装on、emit、off的代码详解
May 29 Javascript
vue实现虚拟列表功能的代码
Jul 28 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生成月历代码
2007/06/14 PHP
用PHP进行MySQL删除记录操作代码
2008/06/07 PHP
php学习之 循环结构实现代码
2011/06/09 PHP
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
PHP中COOKIES使用示例
2015/07/26 PHP
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
js判断鼠标左、中、右键哪个被点击的方法
2015/01/27 Javascript
jquery操作select方法汇总
2015/02/05 Javascript
JavaScript 面向对象与原型
2015/04/10 Javascript
JS+CSS实现带小三角指引的滑动门效果
2015/09/22 Javascript
jQuery增加、删除及修改select option的方法
2016/08/19 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
vue2+el-menu实现路由跳转及当前项的设置方法实例
2017/11/07 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
50行代码实现贪吃蛇(具体思路及代码)
2013/04/27 Python
python对数组进行反转的方法
2015/05/20 Python
在Python的Django框架的视图中使用Session的方法
2015/07/23 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
pymysql模块的操作实例
2019/12/17 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
python中前缀运算符 *和 **的用法示例详解
2020/05/28 Python
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
护士求职推荐信范文
2013/11/23 职场文书
房产委托公证书样本
2014/04/04 职场文书
小学生操行评语大全
2014/04/22 职场文书
残疾人小组计划书
2014/04/27 职场文书
民事授权委托书范文
2014/08/02 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
节水宣传标语口号
2015/12/26 职场文书
Apache Calcite 实现方言转换的代码
2021/04/24 Servers
SpringBoot实现quartz定时任务可视化管理功能
2021/08/30 Java/Android