Почему клик откликается с задержкой
Вопрос
По клику кнопка должна показать спиннер, а потом запустить heavySync() на 400 мс. Спиннер появляется только после окончания работы. Почему?
button.onclick = () => {
spinner.hidden = false;
heavySync();
spinner.hidden = true;
};
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Отрисовка ждёт конца текущей задачи, а её целиком занимает
heavySyncправильный ответ - Свойство
hiddenприменяется только черезrequestAnimationFrame - Обработчики
onclickвыполняются в Web Worker и не могут трогать DOM сразу - Нужно было использовать
addEventListener, тогда отрисовка была бы сразу
Разбор
Отрисовка происходит между задачами. Пока обработчик выполняется синхронно, браузер не может нарисовать кадр, а к концу спиннер уже снова скрыт. Это классический плохой INP. Лечится разбиением: показать спиннер, отдать управление (await scheduler.yield() или setTimeout), потом считать, или вынести работу в воркер. hidden применяется сразу при следующей отрисовке. Обработчики событий выполняются в главном потоке. Способ подписки на отрисовку не влияет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Производительность и Web Vitals»
- CLS
- INP
- LCP
- Длинная задача
- Главная причина CLS у картинок
- Состав Core Web Vitals в 2026
- async и defer у скриптов
- Чем INP лучше FID