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 window.document的属性、方法和事件小结
Oct 24 Javascript
javascript检查表单数据是否改变的方法
Jul 30 Javascript
jQuery.fn和jQuery.prototype区别介绍
Oct 05 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
Apr 12 Javascript
javascript中一些util方法汇总
Jun 10 Javascript
如何通过js实现图片预览功能【附实例代码】
Mar 30 Javascript
javascript简单写的判断电话号码实例
May 24 Javascript
vue学习笔记之v-if和v-show的区别
Sep 20 Javascript
vue使用xe-utils函数库的具体方法
Mar 06 Javascript
angularjs中判断ng-repeat是否迭代完的实例
Sep 12 Javascript
Vue中的this.$options.data()和this.$data用法说明
Jul 26 Javascript
quickjs 封装 JavaScript 沙箱详情
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
全国FM电台频率大全 - 2 天津市
2020/03/11 无线电
调试PHP程序的多种方法介绍
2014/11/06 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
js制作简易年历完整实例
2015/01/28 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
jquery实现input框获取焦点的方法
2017/02/06 Javascript
JavaScript中常见的八个陷阱总结
2017/06/28 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
原生js生成图片验证码
2020/10/11 Javascript
关于uniApp editor微信滑动问题
2021/01/15 Javascript
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
Python使用Supervisor来管理进程的方法
2015/05/28 Python
不可错过的十本Python好书
2017/07/06 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
python @classmethod 的使用场合详解
2019/08/23 Python
opencv python在视屏上截图功能的实现
2020/03/05 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
python函数map()和partial()的知识点总结
2020/05/26 Python
欧洲品牌瓷器餐具网上商店:Porzellantreff.de
2018/04/04 全球购物
如何打开WebSphere远程debug
2014/10/10 面试题
集体婚礼证婚词
2014/01/13 职场文书
《小儿垂钓》教学反思
2014/02/23 职场文书
校庆活动方案
2014/03/31 职场文书
优秀团员事迹材料1000字
2014/08/20 职场文书
政府班子四风问题整改措施
2014/10/04 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书