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

IT技术 javascript jquery
2021-02-20 06:32:44

因此,一旦我从带有图像元数据的 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);

但是 width() 和 height() 函数返回 0 虽然图像具有 30 x 30 px 大小并且它在页面上正确显示。我需要获取其尺寸才能绝对定位图像。

6个回答

您需要等到图像加载完毕才能访问宽度和高度数据。

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

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

$img.attr('src', file.url);

或者使用普通的 JS:

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

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

img.src = file.url;

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

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

那是因为当你检查宽度时你的图像没有加载

尝试以这种方式使用加载事件

$('img').on('load',function(){
  // check width
});

您还可以使用备用 API $.load方法:

$('<img src="' + file.url + '" alt="">').load( function(){ <your function implementation> });

正如@ahren前面的原因是,当你特林得到它的大小不会加载该图像。

如果你想在没有 jQuery 的情况下解决这个问题,你可以使用 vanilla JSaddEventListener方法:

document.getElementsByTagName('img')[0].addEventListener('load', function() {
    // ...
    var width = image.width();
    var height = image.height();
    console.log(width);
    console.log(height);
    // ...
});

对我来说它只适用于“appendTo”

$('<img src="myImage.jpeg">').load(function(){
   $w = $(this).width(); 
   $h = $(this).height();
   $(this).remove()
}).appendTo("body")