2013-04-18 15 views
18

więc tworzę nowy element obrazu kiedyś dostanę odpowiedź z AJAX rozmowy z metadanych obrazu jak ta:jQuery width() i wysokość() return 0 dla elementu img

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); 

Ale szerokości() i wysokości() Funkcje zwracają 0, chociaż obraz ma rozmiar 30 x 30 pikseli i jest poprawnie wyświetlany na stronie. Muszę uzyskać jego wymiary, aby całkowicie ustawić obraz.

+0

Spróbuj $ (okno) .load (function() {var width = image.width(); var height = image.height(); console.log (szerokość); console.log (wysokość); }); –

Odpowiedz

46

Należy poczekać na załadowanie obrazu, aby uzyskać dostęp do danych szerokości i wysokości.

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

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

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

Albo zwykły JS:

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

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

img.src = file.url; 

Ponadto, nie trzeba wstawić obraz do DOM przed odczytać wartości szerokości i wysokości, więc można zostawić aż wymianę .loading-image po obliczeniu wszystkich prawidłowych pozycji.

+0

Dzięki za zwykły kod JS. – dstr

+1

Kod jQuery tutaj nie działa dla mnie, ale zwykły jest, przynajmniej w Chrome v51.0.2704 przy użyciu jQuery 1.12.4. Powinno jednak działać. console.log ($ (this) .width()); logi 0 bez względu na to, może być coś dziwnego w implementacji metody szerokości. Dostęp do właściwości width działa przez konsolę console.log ($ (this) [0] .width); lub jeśli chcesz użyć jQuery: console.log ($ (this) .prop ("width")); –

+0

@StephenBrown Również otrzymuję 0 bez względu na to, jeśli spróbuję użyć $ (this) .width(); – sandre89

7

To dlatego, że obraz nie jest ładowany podczas sprawdzania szerokość

Spróbuj użyć zdarzenie obciążenia w ten sposób

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

Jeśli umieścisz go wewnątrz wywołania AJAX, że będzie działać zbyt, to jest dla metody 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'); 
-1

Spróbuj tego:

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

Można również użyć alternatywnego API $.load metodę:

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

Jak @ahren said wcześniej powodem jest to, że obraz nie ładowany podczas tring dostać to rozmiary.

Jeśli chcesz to naprawić bez jQuery można użyć waniliowy JS addEventListener metoda:

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