Если я делаю изменения DOM в обработчике событий Javascript, являются ли изменения, внесенные поэтапно, или только один раз в конце?

Скажем, у меня есть следующий обработчик событий javascript:

function handleEvent(e){
    document.body.style.backgroundColor = 'green';
    longRunningFunction();
    document.body.style.backgroundColor = 'red';
}

Будет ли браузер сначала отображать зеленый фон, а затем переключать его на красный? Или отобразить красный фон напрямую?

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

UPDATE:

Я должен уточнить, что я не "прицелю" на этот эффект. Скорее, я хочу получить некоторую гарантию, что это произойдет не. Некоторые из моих обработчиков событий меняют многие вещи, и это облегчает мою жизнь, если я могу предположить, что ни одно из промежуточных состояний не отображается.

Ответ 1

Вот что произойдет в среде выполнения JavaScript:

  • document.body.style.backgroundColor изменит свое значение на 'green'.
  • Запустится длительный процесс.
  • document.body.style.backgroundColor изменит свое значение на 'red'.

Неизвестно, как изменения в свойстве backgroundColor будут влиять на внешний вид страницы, если поток JavaScript заблокирован.

Вот пример. Если вы нажмете на слово hello, вы увидите небольшую задержку, а затем фон станет красным:

function handleEvent(e){
    document.body.style.backgroundColor = 'green';
    longRunningFunction();
    document.body.style.backgroundColor = 'red';
}

function longRunningFunction() {
    for(var i=0; i<2000000000; ++i) { +i; }
}

document.body.addEventListener("click", handleEvent);
<div>hello</div>

Ответ 2

Означает ли это, на что вы нацелены?

function handleEvent(e){
    document.body.style.backgroundColor = 'green';
    alert();
    document.body.style.backgroundColor = 'red';
}