Как получить фактическую ширину и высоту изображения с помощью jQuery?
На странице я отобразил 100 изображений, у которых изменились атрибуты ширины и высоты. Идентификатор изображения находится в цикле.
Как получить исходный размер изображения внутри этого цикла?
$(this).appendTo(".prod_image").attr('height',150).attr('width',150).attr('title','').attr('name','').attr('alt','').attr('id','id'+i);
5 ответов
Вы можете получить исходные размеры изображения, используя свойства naturalWidth и naturalHeight объекта dom.
Например.
var image = document.getElementById('someImage');
var originalWidth = image.naturalWidth;
var originalHeight = image.naturalHeight;
С jQuery это будет выглядеть так:
var image = $('#someImage');
var originalWidth = image[0].naturalWidth;
var originalHeight = image[0].naturalHeight;
HTML:
<img id="myimg" src="http://azart-cash.ru/big_pics/kazino_AzartPlay.png"
width="120" height="140"/>
JavaScript:
var img = new Image();
img.onload = function() {
alert(this.width + 'x' + this.height);
}
img.src = $("#myimg").attr('src');
Или просто проверьте это здесь http://jsfiddle.net/Increazon/A5QJM/1/
Единственный способ получить исходный размер - восстановить его в исходное состояние. Вы можете сделать это довольно легко, клонируя изображение, а затем удаляя атрибуты высоты и ширины, чтобы получить реальные значения. Вы также должны затем вставить измененное изображение на страницу, иначе оно не будет иметь рассчитанную высоту / ширину. Вы можете сделать это легко за пределами экрана div. Вот пример:
JS:
// Copy the image, and insert it in an offscreen DIV
aimgcopy = $('#myimg').clone();
$('#store').append(aimgcopy);
// Remove the height and width attributes
aimgcopy.removeAttr('height');
aimgcopy.removeAttr('width');
// Now the image copy has its "original" height and width
alert('Height: '+aimgcopy.height()+' Width: '+aimgcopy.width());
CSS:
#store { position: absolute; left: -5000px; }
HTML:
<img id="myimg" src="http://sstatic.net/so/img/logo.png" width="300" height="120"/>
<div id="store"></div>
Мне пришлось выполнить аналогичную задачу с помощью плагина jQuery, который я создал. Он сохраняет состояние для входного текстового значения, но принцип может быть легко использован для вашей ширины и высоты.
Я хотел бы создать пользовательский объект, который хранит идентификатор исходного объекта, ширину и высоту. Этот объект затем помещается в массив. Когда требуется восстановить значение, просто зациклите массив пользовательских объектов, чтобы они соответствовали идентификатору и бинго, объекту с оригинальной шириной и высотой.
Вы можете проверить код моего плагина на http://www.wduffy.co.uk/jLabel, чтобы увидеть, как я это реализовал. В зависимости от того, сколько изображений вы изменяете, массив может стать немного тяжелым.
Пример может выглядеть так
var states = new Array();
function state($obj) {
// Public Method: equals
this.equals = function($obj) {
return $obj.attr('id') == this.id;
};
// Public Properties
this.id = $obj.attr('id');
this.width = $obj.attr('width');
this.height = $obj.attr('height');
};
function getState($obj) {
var state;
$.each(states, function() {
if (this.equals($obj)) {
state = this;
return false; // Stop the jQuery loop running
};
});
return state;
};
Попробуй это:
$("<img>")
.attr("src", element.attr("src"))
.load(function(){
MG.originalSize[0] = this.width;
MG.originalSize[1] = this.height;
});