2010-09-21 6 views
6

Я хочу получить высоту/ширину изображения внутри скрытого div-содержащего, но .height() и .width() оба возвращают 0 (как и ожидалось).Получите высоту изображения внутри скрытого div


$('body').append('<div id="init"><img id="myimg" src="someimage.png" /></div>'); 
$('#init').hide(); 
$('#myimg').height(); // == 0 
$('#myimg').width(); // == 0 

Как я могу получить правильную высоту/ширину изображения? Мне это нужно, чтобы сделать какие-то решения :-)

С наилучшими пожеланиями, Biggie

+2

Если вы читаете комментарии, вы увидите, что @Yi Цзян говорит, что его собственный ответ является ошибочным. – egrunin

+0

Не могли бы вы изменить свой принятый ответ (да, вы можете это сделать) на Роберта, так как он прав, а я нет. Спасибо. –

ответ

9

Его, потому что изображение еще не загрузилось .....

$('body').append('<div id="init"><img id="myimg" src="something.png" /></div>'); 
$('#init').hide(); 

$('#myimg').bind("load",function(){ 
    alert(this.height) //works 
})​ 

Heres испытание: http://jsfiddle.net/WMpSy/

+0

Это работает, но объяснение неверно. Конечно, сначала нужно загружать изображение, но даже после загрузки изображения, если изображение находится внутри скрытого div, методы jQuery height() и width() будут по-прежнему возвращать 0. Это решение работает, потому что оно использует JavaScript элемент, а не элемент jQuery, то есть this.height, а не $ (this) .height(). Более подробную информацию см. В комментарии Samuel. –

1

Сделать DIV временно видимым для того, чтобы вычислить высоту или скрыть DIV от экрана вместо не используя дисплей: Нет. Я использовал первый подход и нашел его достаточно быстрым, чтобы вы никогда не увидели элемент.

+1

Да, и даже если он достаточно медленный, чтобы показать ему что-то вроде абсолютной позиции плюс -1000 полей, следует скрыть его в течение периода, когда он будет виден. –

4

Вы не можете скрыть его, если хотите правильную высоту и ширину, но вы можете переместить его так, чтобы он был вне экрана и таким образом эффективно скрыт. Попробуйте это:

var hiddenDiv = $('<div id="init"><img id="myimg" src="someimage.png" /></div>').appendTo('body').css({ 
    'position': 'absolute', 
    'top': -9999 
}); 

var img = hiddenDiv.children('img'); 
img.height(); 
img.width(); 
+0

Как вы указали в моем сообщении, это загрузка кэшированного изображения, OP должен просмотреть оба ответа. – RobertPitt

+0

@Robert Я провел тестирование - элементы 'display: none' имеют высоту - ввод в' $ ('# answer-3761104'). Hide(). Height() 'дает правильную высоту, поэтому этот ответ совершенно неправильно. –

+0

Я думал, что это будет до "события загрузки изображения". – RobertPitt

-7

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

+1

-1 Если вы не объясните * почему *, или каковы могут быть его альтернативы, это не полезно. – egrunin

+4

* Ты слишком думаешь об этом. – Stephen

0

вы должны использовать находку()

$('body').find('#myimg').width(); 

или

$('body').find('#myimg').attr("width"); 

becouse вы приложили его после того, как DOM был загружен

+5

Неверно, зачем нам искать, когда у нас есть удостоверение личности? – RobertPitt

+0

У меня была та же проблема, и я исправил ее, используя find(). –

0

Я не уверен, что вы можете сделать это с jQuery (или javascript вообще). У меня была аналогичная проблема с недопонимаемыми высотами и ширинами при загрузке/скрытии img. Вы можете, однако, ждать до нагрузок изображения, получить его правильной высоты и ширины, а затем скрыть родителя ... как так:

var height, width; 

$('#myimg').load(function() { 
    height = $(this).height(); 
    width = $(this).width(); 
    $('#init').hide(); 
} 
21

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

var img = hiddenDiv.children('img'); 

var imgHeight = img.get(0).height; 
var imgWidth = img.get(0).width; 

Метод JQuery get(0) позволяет получить на нижележащем элементе DOM и достаточно интересно, размеры DOM элемента не изменение.

Обратите внимание, что по соображениям производительности вам нужно будет кэшировать img.get(0), если вы планируете использовать его больше.

jQuery get method documentation

+2

Спасибо. Это единственный ответ, который работал для меня, потому что изображения, которые я пытался найти, были в скрытом div после завершения загрузки. – Jerry

+1

«Довольно интересно» правильно! Предположим, что «img» представляет собой один целевой элемент ... не уверен, почему img.height и img.get (0) .height возвращает разные результаты, но я рад, что версия .get() существует! Спасибо Samuel –

+3

Это должен быть принятый ответ. Добавление изображения, а затем его скрытие может работать, но это не так чисто, как этот метод. – squarecandy

1

У меня была аналогичная проблема. Дело в том, что если изображение или div, содержащие изображение, имеют стиль = "display: none", то его css height = 0. Я обнаружил, что функции height() и width() дали неправильные значения, например 0! Решение для меня состояло в том, чтобы гарантировать, что у изображений есть свои атрибуты, поэтому, даже если они скрыты, значения все еще доступны.Поэтому используйте:

$ ('# testImg'). Attr ('height') и $ ('# testImg'). Attr ('width'), чтобы получить высоту и ширину изображения.

0

Да его, потому что изображение еще не загружено, и это мое решение:

$('<img src="My Image URL" />').appendTo('body').css({ 
       'position': 'absolute', 
       'top': -1 
      }).load(function() { 
       console.log('Image width: ' + $(this).width()); 
       console.log('Image height: ' + $(this).height()); 
       $(this).remove(); 
      }); 
Смежные вопросы