2013-04-11 5 views
0

Итак, у меня есть этот элемент, который мне нужен, чтобы получить width() и height(), но он продолжает возвращать 0, но когда я вхожу в консоль $('#lightingData').width(), он дает мне правильные значения. Я думаю, мне нужно использовать какую-то другую функцию обертки, я пробовал $(document).ready(function() {...}); и $(window).load(function(){...});jQuery ждать до тех пор, пока функция не будет вызвана

Есть ли другие функции-обертки, которые будут ждать еще до запуска?

+0

Нагрузка окна должна быть более чем достаточно для статического элемента. Вы добавляете элемент с javascript? –

+0

Можете ли вы опубликовать полный пример и jsFiddle? – j08691

+0

Покажите нам свой код –

ответ

2

если #lightningData элемент имеет display:none когда onload запускается и код выполняется, widht() и height() вернет 0. Вы можете явно вызвать .show() на элемент перед проверкой размеров

$('#lightingData').show().width(); 
+0

Это полезно, только если элемент фактически загружен в то время, когда он называется –

+0

да. это данность. ширина ничего не может быть больше 0. – TheBrain

+0

Вы также можете вызвать '.hide()' сразу в конце, чтобы восстановить элемент в его предыдущем состоянии. – Ian

2

Одна из вещей, вы можете попробовать явно ожидать, что этот конкретный элемент будет загружен, прежде чем пытаться позвонить .width() и .height().

Попробуйте это:

$('#lightingData').load(function() { 
    ...height and width manipulation here... 
    ...don't forget about scope... 
}); 

Вы должны поместить это внутри вашего $(document).ready(...), как вы хотите, чтобы документ, по крайней мере знать, что $('#lightingData') есть. Поскольку вы получаете 0 для height и width, а не ошибки, я могу предположить, что они, по крайней мере, найдены, до вызова методов.


UPDATE

За комментариями, добавленными @Ian, я хочу отметить, что это будет работать только для определенных типов элементов (URL, IFrames, изображения/СМИ и т.д. - в основном ничего который должен загрузить его содержимое). Я не собираюсь обновлять код, так как то, что у меня выше, является правильным, если вы используете его для одного из этих типов элементов, и было бы глупо, если вы используете его для другого. Если вы используете его для обоих, вам нужно только добавить условие/фильтр (на основе вашей реализации), чтобы определить, должен ли этот код привязываться к этому конкретному элементу.

+0

Почему вы обертываете объект jQuery в другой? – Ian

+0

@Ian - ха-ха, это была ошибка, спасибо! Я думаю, что я собирался набрать селектор, изначально, но потом пришел в себя и пошел с копией макарон. Мел еще один из причин, чтобы быть осторожным с копией-пасты! –

+0

Кроме того, проверка внутри '$ (window) .on (" load ", function() {});' должна быть более чем достаточно, поскольку все изображения будут загружены - тогда вам не нужно событие 'load' изображения. Проблема более вероятна, что элемент скрыт и ширина/высота не могут быть вычислены. – Ian

0

Если вы 100% уверены в том, что ширина по-прежнему 0 в точке $ (документ) .ready()

попробовать это:

$(function() { 
    $('#lightingData').show(function(e) { 
     var width = $(this).width(); 
     //do something 
    }); 
}); 

Или что-то глупое, но будет работать 90% кейса:

$(function() { 
    setInterval(function() { 
     var width = $('#lightingData').width(); 
     //do something 
    }, 1000); 
}); 

Это задерживает действие в течение 1 секунды после $ (document) .ready().

Без точного сценария трудно дать определенное решение.

Смежные вопросы