【问题标题】:Image event on size loaded加载大小的图像事件
【发布时间】:2012-10-19 14:21:43
【问题描述】:

正如您在网页加载大图像时看到的那样,浏览器可以在加载开始时知道图像大小(宽度和高度)。

我正在寻找一种在 Javascript 中添加在尺寸已知时调用的事件(而不是在加载完整图像时)的方法;有点像metadataloaded 的视频。

代码示例:

var img = new Image();
img.src = 'images/picture.jpg';

console.log(img.width,img.height);  // 0, 0 (image size is not known yet)

img.addEventListener('imagesizeloaded', () => {
    console.log(img.width,img.height);  //expected: 1024, 768 (for example)
});

【问题讨论】:

  • 我认为load 是唯一的选择
  • 您可以通过其他方式发送元数据
  • 我认为不存在这样的事件(已加载图像标题)

标签: javascript metadata dom-events image-size


【解决方案1】:

您可以在服务器上创建一个 AJAX 回调来获取元数据。更好的是,发送带有文件名的元数据。

使用 jQuery 的示例(客户端):

var img = new Image();
img.src = "images/picture.jpg";

$.get("ajax.php", {action: "getImageSize", url: img.src})
 .success(function(r){
   console.log(r.width, r.height)
 })

服务器部分取决于您使用的服务器端技术。它需要

open the image by its url
read the image metadata
send a JSON response

在最坏的情况下,您可以轮询图像数据,直到它不为零。

var img = new Image();
img.src = "images/picture.jpg";

(function testImageSizeKnown(){
  if(img.height && img.width){
    console.log(img.height, imp.width)
  }else{
    setTimeout(testImageSizeKnown, 100) // check every 100 ms
  }
)()

【讨论】:

  • 谢谢!我的目标是一个不依赖服务器的解决方案,那么第二个版本对我来说更好,但是是否可以使用监听器“onprogress”事件(在图像上或在加载结束时 xhr2 将数据发送到新图像上)而不是使用超时?
  • @Yukulélé 根据 MDN,图像元素似乎没有您可以使用的 progress 事件 - 并且通过 XHR 获取图像数据似乎有问题(而且您可能仍然必须能够解析部分二进制数据,以及最终显示图像)。您可以将 onprogress 处理程序附加到图像,但我怀疑它会被调用。
猜你喜欢
  • 1970-01-01
  • 2011-08-28
  • 2010-10-28
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多