Подтвердить что ты не робот

JQuery width() и height() return 0 для элемента img

Итак, я создаю новый элемент изображения, как только получаю ответ от вызова 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 пикселей и оно отображается правильно на странице. Мне нужно получить его размеры, чтобы полностью позиционировать изображение.

4b9b3361

Ответ 1

Вам нужно подождать, пока изображение не загрузится, чтобы получить доступ к данным ширины и высоты.

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 до тех пор, пока не вычислите все правильные позиции.

Ответ 2

Это потому, что ваше изображение не загружается, когда вы проверяете ширину

Попробуйте использовать событие загрузки таким образом

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

Ответ 3

Вы также можете использовать альтернативный API $. load:

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

Ответ 4

Как сказал @ahren ранее, причина в том, что изображение не загружается, когда вы пытаетесь получить его размеры.

Если вы хотите исправить это без jQuery, вы можете использовать ванильный метод JS addEventListener:

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

Ответ 5

Если "на нагрузке" не работает, используйте это

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

Ответ 6

Попробуйте следующее:

$('.loading-image').replaceWith(loadedImageContainter);
$('.loading-image').load(function(){
    var width = image.width();
    var height = image.height();
    console.log(width);
    console.log(height);
});

Ответ 7

Если вы поместите его внутри вызова AJAX, это тоже будет работать, это для метода json

$.post("URL",{someVar:someVar},function(data){

   var totalImgs = $('body').find('img').length;

   var image = $('<img src="' + data.file[0].url + '" alt="" id="IMG_'+ totalImgs +'">');

   loadedImageContainter.append(image);
   $('.loading-image').replaceWith(loadedImageContainter);

   var width = $('#IMG_'+totalImgs).width();
   var height = $('#IMG_'+totalImgs).height();

},'json');