Здесь мы просто читаем уже внесенные изменения ...
Не совсем. Присвоение className
означает, что браузер должен перекомпоноваться, но это не значит, что уже перекомпоновал , когда вы закончите присваивание. Он может подождать (в современных браузерах, подождет) до следующего рисования, что не произойдет, пока не завершится (по крайней мере) текущий код JavaScript.
Но когда вы читаете вычисляемое свойство, такое как clientHeight
, браузер должен приостановить код JavaScript и переформатировать страницу, чтобы он мог вернуть точное число. Итак, ваш «хороший» код делает это:
elementA.className = "a-style"; // marks the layout stale
elementB.className = "b-style"; // marks the layout stale (no change)
var heightA = elementA.offsetHeight; // triggers reflow
var heightB = elementB.offsetHeight; // no need for reflow, the layout isn't stale