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实现等比例缩放图片效果插件
Jul 24 Javascript
有关js的变量作用域和this指针的讨论
Dec 16 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
May 30 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
Oct 17 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
May 19 Javascript
最短的IE判断var ie=!-[1,]分析
May 28 Javascript
javascript实现随时变化着的背景颜色
Apr 02 Javascript
jQuery中extend()和fn.extend()方法详解
Jun 03 Javascript
用svg制作富有动态的tooltip
Jul 17 Javascript
javascript ES6 新增了let命令使用介绍
Jul 07 Javascript
JavaScript 日期时间选择器一些小结
Apr 02 Javascript
ES6学习笔记之let与const用法实例分析
Jan 22 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/08/09 PHP
php实现图片局部打马赛克的方法
2015/02/11 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
2015/11/18 PHP
浅谈PHP Cookie处理函数
2016/06/10 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
JavaScript Undefined,Null类型和NaN值区别
2008/10/22 Javascript
window.print打印指定div实例代码
2013/12/13 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
JS实现黑色风格的网页TAB选项卡效果代码
2015/10/09 Javascript
js 声明数组和向数组中添加对象变量的简单实例
2016/07/28 Javascript
JavaScript 函数模式详解及示例
2016/09/07 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
2016/09/12 Javascript
Vue框架中正确引入JS库的方法介绍
2017/07/30 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
微信小程序时间标签和时间范围的联动效果
2019/02/15 Javascript
vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新
2019/05/14 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
js利用递归与promise 按顺序请求数据的方法
2019/08/30 Javascript
JS实现可控制的进度条
2020/03/25 Javascript
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python中ConfigParse模块的用法
2014/09/29 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
2018/02/05 Python
浅谈python标准库--functools.partial
2019/03/13 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
2020/10/31 Python
canvas画图被放大且模糊的解决方法
2020/08/11 HTML / CSS
世界领先的豪华床上用品供应商之一:Bedeck Home
2019/03/18 全球购物
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
职业规划实施方案
2014/06/10 职场文书
关于爱国的标语
2014/06/24 职场文书
中学教师暑期培训方案
2014/08/27 职场文书
三严三实对照检查材料思想汇报
2014/09/28 职场文书
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android