jQuery width()和height()为img元素返回0

Ric*_*nop 23 javascript jquery

所以我创建一个新的图像元素,一旦我从AJAX调用响应像这样的图像元数据:

var loadedImageContainter = $('<div class="loaded-image-container"></div>');
var image = $('<img src="' + file.url + '" alt="">');
loadedImageContainter.append(image);
$('.loading-image').replaceWith(loadedImageContainter);
var width = image.width();
var height = image.height();
console.log(width);
console.log(height);
Run Code Online (Sandbox Code Playgroud)

但是width()和height()函数返回0,尽管图像大小为30 x 30 px并且它在页面上正确显示.我需要获得它的尺寸才能绝对定位图像.

ahr*_*ren 53

您需要等到图像加载后才能访问宽度和高度数据.

var $img = $('<img>');

$img.on('load', function(){
  console.log($(this).width());
});

$img.attr('src', file.url);
Run Code Online (Sandbox Code Playgroud)

或者使用简单的JS:

var img = document.createElement('img');

img.onload = function(){
  console.log(this.width);
}

img.src = file.url;
Run Code Online (Sandbox Code Playgroud)

此外,在读取宽度和高度值之前,您无需将图像插入DOM中,因此您可以.loading-image在计算所有正确位置之前保留替换图像.

  • 这里的 jQuery 代码对我不起作用,但至少在使用 jQuery 1.12.4 的 Chrome v51.0.2704 中是简单的。不过它应该可以工作。console.log($(this).width()); 无论如何,logs 0 可能在 width 方法的实现中有些奇怪。访问 width 属性可以通过 console.log($(this)[0].width); 或者如果你想使用 jQuery: console.log($(this).prop("width")); (2认同)
  • 我发现当使用Control-R和Control-F5的组合重复加载页面时,加载事件并不总是被触发.我怀疑这是因为我在jQuery DOM数组中迭代一组图像所以我必须先等待document.ready事件触发,这可能是在图像加载之后.为了解决这个问题,我添加了一个检查宽度/高度是否为0的检查,只检查onload事件是否为0. (2认同)

Moh*_*dil 8

这是因为检查宽度时未加载图像

尝试以这种方式使用load事件

$('img').on('load',function(){
  // check width
});
Run Code Online (Sandbox Code Playgroud)