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 相关文章推荐
Prototype使用指南之form.js
Jan 10 Javascript
ext form 表单提交数据的方法小结
Aug 08 Javascript
js函数调用常用方法详解
Dec 03 Javascript
深入了解javascript中的prototype与继承
Apr 14 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
Oct 14 Javascript
jQuery插件实现多级联动菜单效果
Dec 01 Javascript
js实现文字垂直滚动和鼠标悬停效果
Dec 31 Javascript
jQuery日历插件datepicker用法详解
Mar 03 Javascript
js控住DOM实现发布微博效果
Aug 30 Javascript
详解Vue-Cli 异步加载数据的一些注意点
Aug 12 Javascript
Element UI 自定义正则表达式验证方法
Sep 04 Javascript
详解vue2.0模拟后台json数据
May 16 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面向对象全攻略 (十六) 对象的串行化
2009/09/30 PHP
PHP加Nginx实现动态裁剪图片方案
2014/03/10 PHP
php通过数组实现多条件查询实现方法(字符串分割)
2014/05/06 PHP
php生成无限栏目树
2017/03/16 PHP
use jscript with List Proxy Server Information
2007/06/11 Javascript
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
js操作时间(年-月-日 时-分-秒 星期几)
2010/06/20 Javascript
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
深入理解JS正则表达式---分组
2016/07/18 Javascript
关于Promise 异步编程的实例讲解
2017/09/01 Javascript
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
2017/09/29 NodeJs
vue结合Echarts实现点击高亮效果的示例
2018/03/17 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
2018/04/10 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
Python functools模块学习总结
2015/05/09 Python
python中enumerate函数用法实例分析
2015/05/20 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
2018/05/10 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
2021/02/01 Python
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
迪拜航空官方网站:flydubai
2017/04/20 全球购物
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
linux系统都有哪些运行级别
2012/04/15 面试题
职业女性的职业规划
2014/03/04 职场文书
求职自荐信怎么写
2014/03/06 职场文书
思想作风纪律整顿心得体会
2014/09/04 职场文书
小学生九一八纪念日83周年演讲稿500字
2014/09/17 职场文书
2014年体育工作总结
2014/11/24 职场文书
七一晚会主持词
2015/06/29 职场文书
婚宴祝酒词大全
2015/08/10 职场文书
【海涛教你打DOTA】黑鸟第一视角解说
2022/04/01 DOTA