2009-02-04 2 views
49

Какие виды действий вызовут оплату веб-страницы с помощью DOM?Когда происходит переполнение в среде DOM?

Кажется, что есть разные точки зрения. Согласно http://www.nczonline.net/blog/2009/02/03/speed-up-your-javascript-part-4/, это происходит

  • При добавлении или удалении узла DOM.
  • При динамическом применении стиля (например, element.style.width = "10px").
  • Когда вы извлекаете измерение, которое должно быть рассчитано, например, обращение к offsetWidth, clientHeight или любому вычисленному значению CSS (через getComputedStyle() в DOM-совместимых браузерах или currentStyle в IE).

Однако, в соответствии с http://dev.opera.com/articles/view/efficient-javascript/?page=3, измерение триггеров срабатывания происходит только тогда, когда в системе уже выполнено переполнение.

Есть ли у кого-нибудь идеи?

+0

Различные браузеры ведут себя по-разному. – some

+9

За исключением случаев, когда они ведут себя одинаково. ;) – coderjoe

+0

Запоминание Пола Ирриша о [избегании переплавов] (https://youtu.be/q_O9_C2ZjoA?t=4m23s): пересчеты вызваны изменениями высоты, ширины, offsetWidth и т. Д. Абсолютное позиционирование [не вызывает перекосы] (https://developers.google.com/speed/articles/reflow?hl=en). – ruhong

ответ

43

Оба изделия являются правильными. Можно с уверенностью предположить, что всякий раз, когда вы делаете что-то, что может разумно потребовать, чтобы размеры элементов в DOM вычислялись, вы будете активировать оплату.

Кроме того, насколько я могу судить, обе статьи говорят одно и то же.

Первая статья говорит оплавления происходит, когда:

Когда вы получить измерения, которые должны быть рассчитаны, такие как доступ к offsetWidth, clientHeight, или любое вычисленное значение CSS (через getComputedStyle() в DOM-совместимых браузерах или currentStyle в IE), в то время как изменения DOM помещаются в очередь.

Вторая статья гласит:

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

Этот эффект создается, когда измерения проводятся с использованием свойств, как offsetWidth, или с использованием методов, как getComputedStyle. Даже если числа не используются, просто используя любой из них, пока браузер все еще кэширует изменения, будет достаточно, чтобы вызвать скрытый пересчет. Если эти измерения повторяются неоднократно, вам следует рассмотреть их только один раз и сохранить результат, который затем можно будет использовать позже.

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

Во всех смыслах и целях просто верьте тому, что они оба говорят, когда говорят, что все три типа взаимодействий могут вызвать оплату.

Cheers.

+0

Есть ли способ заставить перекрасить (в дополнение к переплаву)? Чтобы сделать большую страницу небольшими приращениями и, следовательно, увеличить воспринимаемую скорость рендеринга конечного пользователя. –

+0

@coderjoe, «взятие измерений элемента заставит его оплатить», почему они не кэшируются в браузерах? Что произойдет, если я просто позвоню getComputedStyle 3 раза сразу после каждого другого! У меня будет 3 перепланировки! – faressoft

1
document.body.style.display = 'none'; 
document.body.style.display = 'block'; 

Это часто решает эти непонятные ошибки макета.

+0

Я столкнулся с ошибкой ie6, которая отображает swf в неправильном месте. Решено, установив 'swfObj.style.display =" block "' – aztack

+28

Вау, вам все равно нужно поддерживать IE6? Оставайтесь сильными, солдат. –

3

Посмотрите на раздел «Оказание, вызванное доступом к данным», Understanding Internet Explorer Rendering Behaviour, где следующий код в IE вызовет операцию рендеринга.

function askforHeight() { 
    $("#lower").height(); 
} 
Смежные вопросы