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 DOM编程实例(智播客学习)
Nov 23 Javascript
两种WEB下的模态对话框 (asp.net或js的分别实现)
Dec 02 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
Feb 03 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
Jan 15 Javascript
JavaScript二维数组实现的省市联动菜单
May 08 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
Jun 01 Javascript
详解JavaScript的流程控制语句
Nov 30 Javascript
jquery实现倒计时功能
Dec 28 Javascript
微信小程序 支付功能开发错误总结
Feb 21 Javascript
详解vue.js的devtools安装
May 26 Javascript
环形加载进度条封装(Vue插件版和原生js版)
Dec 04 Javascript
js基于div丝滑实现贝塞尔曲线
Sep 23 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中用正则表达式清除字符串的空白
2011/01/17 PHP
php算法实例分享
2015/07/14 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
JavaScript Chart 插件整理
2010/06/18 Javascript
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
JavaScript计时器示例分析
2015/02/05 Javascript
js实现九宫格图片半透明渐显特效的方法
2015/02/16 Javascript
jQuery解决浏览器兼容性问题案例分析
2016/04/15 Javascript
vue.js开发环境搭建教程
2017/05/04 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
vue实现评论列表功能
2019/10/25 Javascript
[48:02]Ti4循环赛第三日 VG vs Liquid和NEWBEE vs DK
2014/07/12 DOTA
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
介绍Python中几个常用的类方法
2015/04/08 Python
python字符串编码识别模块chardet简单应用
2015/06/15 Python
python使用tkinter实现简单计算器
2018/01/30 Python
Python生成器generator用法示例
2018/08/10 Python
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
利用CSS3实现自定义滚动条代码分享
2016/08/18 HTML / CSS
德国婴儿推车和儿童安全座椅商店:BABYSHOP
2016/09/01 全球购物
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
大四自我鉴定范文
2013/10/06 职场文书
教师实习的自我鉴定
2013/10/26 职场文书
医学生自荐信范文
2013/12/03 职场文书
酒店员工检讨书
2014/02/18 职场文书
《散步》教学反思
2014/03/02 职场文书
暑假学习心得体会
2014/09/02 职场文书
求职自荐信范文(优秀篇)
2015/03/27 职场文书
欠款起诉书范文
2015/05/19 职场文书
辩护词格式
2015/05/22 职场文书
结婚幸福感言
2015/08/01 职场文书
《月光曲》教学反思
2016/02/16 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技