Почему getComputedStyle возвращает 'auto' для значений пикселей сразу после создания элемента? - PullRequest
9 голосов
/ 25 декабря 2011

Я использовал Mustache для генерации HTML-кода и insertAdjacentHTML для размещения его на странице.Очевидно, он хорошо преобразован в структуру DOM, поскольку впоследствии я могу получить к нему доступ, используя вызов document.querySelector('.contentarea').Однако, если я пытаюсь получить значение пикселя для ширины или высоты, он продолжает отбрасывать 'auto'.

Думая, что это может быть просто проблема с getComputedStyle, я пытался использовать .getBoundingClientRect и .offsetWidth вместо.Оба вернули 0.Это работает, если я немного задерживаю вызов, помещая его в setTimeout(function(){}, 1), но это не практично для моего производственного кода, так как он должен идти внутри синхронного конструктора.

Это происходит в обоих Firefox (Аврора)и хром.Я вспомнил, как читал статью о том, как Mozilla улучшил производительность манипулирования DOM, используя ленивую конструкцию фрейма, и подумал, что может быть ошибка, если фреймы немного слишком ленивый, но, поскольку это происходит и в Chrome, этоменее вероятно.

У кого-нибудь есть идеи о том, что здесь происходит или как обойти это?Мне действительно нужна информация о высоте / ширине пикселя сразу после вставки HTML.

PS: какие-либо браузеры выполняют анализ / построение HTML для DOM в отдельном потоке?Я думал, что это может вызвать и такое поведение.

НЕВЕРМИНД: Это была моя вина.Я просто не заметил стиль display: none;, который был установлен до того, как код попытался получить измерения.

Ответы [ 2 ]

11 голосов
/ 22 сентября 2012

Есть пара вещей, которые могут вызвать результат "auto".Вы нашли один из них;display: none.Если элемент является встроенным, он также возвращает auto.

По сути, это должен быть элемент block или inline-block, и он должен отображаться.

0 голосов
/ 25 декабря 2011

По моему опыту, многие браузеры (IE, Chrome, Firefox) целенаправленно откладывают вычислительную компоновку до тех пор, пока потоки Javascript не завершатся или не завершатся с помощью вызова тайм-аута.

Единственное решение, которое я знаю, это уступить браузеру, а затем перезапустить. Ваш метод использования setTimeout работает хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...