2013-05-02 19 views
16

Mam ten kod do tej pory:Jak uzyskać naturalne wymiary obrazu za pomocą javascript lub jquery?

var img = document.getElementById('draggable'); 
var width = img.clientWidth; 
var height = img.clientHeight; 

Jednak to wpędza mnie atrybutów HTML - style CSS. Chcę uzyskać wymiary rzeczywistego zasobu obrazu pliku.

Potrzebuję tego, ponieważ po przesłaniu obrazu jego szerokość zostanie ustawiona na 0 pikseli i nie mam pojęcia, dlaczego tak się dzieje. Aby temu zapobiec, chcę uzyskać rzeczywisty wymiar i zresetować je. czy to możliwe?

Edycja: Nawet gdy próbuję uzyskać naturalWidth, otrzymuję 0 jako wynik. Dodałem zdjęcie. Dziwne jest to, że dzieje się tak tylko wtedy, gdy przesyłam nowe pliki i po odświeżeniu działa tak, jak powinien.

http://oi39.tinypic.com/3582xq9.jpg

+0

Spójrz na [to] (http://stackoverflow.com/a/626505/6190800) rozwiązanie –

Odpowiedz

33

Można użyć naturalWidth i naturalHeight, właściwości te zawierać rzeczywiste, niemodyfikowanych szerokość i wysokość obrazu, ale trzeba poczekać, aż obraz został załadowany, aby uzyskać do nich

var img = document.getElementById('draggable'); 

img.onload = function() { 
    var width = img.naturalWidth; 
    var height = img.naturalHeight; 
} 

To jest tylko obsługiwane od IE9 i wyżej, jeśli musisz obsługiwać starszą przeglądarkę, możesz utworzyć nowy obraz, ustawić jego źródło na ten sam obraz, a jeśli nie zmienisz rozmiaru obrazu, zwróci on obrazy o naturalnym rozmiarze, będzie to ustawienie domyślne, gdy nie zostanie podany inny rozmiar:

var img  = document.getElementById('draggable'), 
    new_img = new Image(); 

new_img.onload = function() { 
    var width = this.width, 
     heigth = this.height; 
} 

new_img.src = img.src; 

FIDDLE

+2

nie jQuery czyni mnie szczęśliwym :-) –

+0

To rozwiązuje, dziękuję. Czy zawijanie mojego kodu wewnątrz funkcji jQuery.ready() jest niewystarczające, ponieważ obraz nie jest do tego czasu załadowany? Mam problem tylko przy przesyłaniu nowego pliku na serwer. – user1848605

+4

Obrazy nie są ładowane, gdy uruchomiona jest funkcja gotowości DOM jQuery, tylko DOM jest gotowy. '$ (window) .on ('load')' uruchomi się, gdy wszystko zostanie załadowane, ale samo dołączenie programu obsługi zdarzenia onload bezpośrednio do obrazu będzie lepszym IMO. – adeneo

17

Istnieje img.naturalHeight i img.naturalWidth który daje szerokość i wysokość samego obrazu, a nie elementu DOM.

+2

To jest bardzo dobre rozwiązanie. – SoonDead

+3

Nie działa w IE8 lub poniżej, a nie w Operze, o ile mi wiadomo. – adeneo

+2

Interesujące. Zauważ, że dla IE jest to dla IE9 lub wyżej. Sprawdziłem to i natknąłem się na ten fragment, który dodaje '.naturalHeight()' i '.naturalWidth()' do jQuery. Pomyślałem, że mogę podzielić się tym trochę informacji tutaj: http://www.jacklmoore.com/notes/naturalwidth-and-naturalheight-in-ie/ –

2

Możesz użyć następującej funkcji, którą stworzyłem.

Funkcja

function getImageDimentions(imageNode) { 
    var source = imageNode.src; 
    var imgClone = document.createElement("img"); 
    imgClone.src = source; 
    return {width: imgClone.width, height: imgClone.height} 
} 

html:

<img id="myimage" src="foo.png"> 

używać go tak jak to

var image = document.getElementById("myimage"); // get the image element 
var dimentions = getImageDimentions(image); // get the dimentions 
alert("width: " + dimentions.width + ", height: " + dimentions.height); // give the user a visible alert of the dimentions 
Powiązane problemy