2013-08-07 3 views
0

Некоторые предпосылки: Я использую JavaScript для вертикального центрирования дочерних divs, которые различаются по высоте в зависимости от условий в родительском div. Функция центрирования выглядит следующим образом:Функция не выполняется должным образом, если она не вызывается дважды

function autoCenter() 
{var firstline = document.getElementById("ntext"); 
var secondline = document.getElementById("dtext"); 
var l1h = parseInt(getComputedStyle(firstline)["height"]); 
var l2h = parseInt(getComputedStyle(secondline)["height"]); 
var d1h = parseInt(getComputedStyle(document.getElementById("design"))["height"]); 
var d2h = parseInt(getComputedStyle(document.getElementById("design2"))["height"]); 
var totalh = l1h + l2h + d1h+ d2h; 
document.getElementById("desdiv").style.top = (212-totalh)/2 + "px"; 
firstline.style.top = (212-totalh)/2 + d1h +"px"; 
secondline.style.top = (212-totalh)/2 + l1h + d1h + "px"; 
document.getElementById("desdiv2").style.top = (212-totalh)/2 + l1h + l2h + d1h+ "px";} 

NTEXT, DTEXT, DesDiv и desdiv2 являются дивы. Первые 2 изменения основаны на размере текста в них и втором 2 изменениях в зависимости от размера изображения в них (дизайн ids & design 2)

Эта функция отлично работает, когда изменяются только те изменения дивы. У меня возникают проблемы, когда я изменяю div div. Похоже, что первая часть функции, которая включает getComputedStyle, не получает новое значение высоты для изображения, пока функция не будет вызвана во второй раз. После того, как он называется во второй раз, все центры, как это должно быть. Но в идеале все должно работать над первым вызовом. Что я делаю неправильно здесь, и как я могу заставить divs сосредоточиться на первом вызове?

Редактировать: Я не уверен, что это актуально, но autoCenter() всегда вызывается из другой функции.

+4

У вас есть что-то против использования точек с запятой? – Lance

+3

Возможно, это связано с тем, что изображения не полностью загружены во время вызова функции в первый раз? Попробуйте добавить setTimeout, чтобы проверить это. –

+0

@Lance Nope. Как правило, считается, что лучше всего всегда ставить их на концах линий, которые могут иметь их? Я до сих пор довольно новичок в этом. – Ducky

ответ

2

Это, скорее всего, потому, что ваши изображения не загружены полностью во время вызова функции центра.

Добавить прослушиватель событий к изображениям, чтобы центральная функция срабатывала при загрузке изображений.

Что касается точки с запятой. Вставьте их, всегда. Найдите точку с запятой.

+0

Что было бы лучшим способом добавить слушателя событий к изображениям? Я бы использовал onload = или что-то еще? – Ducky

+1

Лично я использую addEventListener, но это действительно зависит от вас и какой спецификации вам нравится. При создании элемента img добавьте слушателя. Затем, когда вы меняете src, onload должен срабатывать при загрузке нового src. Мне приходилось делать это много раз, и это работает. –

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