У меня есть некоторая обработка, которая займет несколько секунд, поэтому я хочу добавить визуальный индикатор, пока он выполняется.
.processing
{
background-color: #ff0000;
}
<div id="mydiv">
Processing
</div>
Сценарий:
$("#mydiv").addClass("processing");
// Do some long running processing
$("#mydiv").removeClass("processing");
Я наивно думал, что класс будет применен к div, и пользовательский интерфейс будет обновлен. Тем не менее, при запуске этого в браузере (по крайней мере, в Firefox) div никогда не выделяется. Может кто-нибудь объяснить мне, почему мой div никогда не выделяется? Класс добавляется, происходит обработка, а затем класс удаляется; пользовательский интерфейс не обновляется в промежутке, и пользователь никогда не видит красный фон.
Я знаю, что JS является однопоточным, но я всегда предполагал, что рендеринг в браузере будет выполняться синхронно по мере обновления DOM. Мое предположение неверно?
И что более важно, каков рекомендуемый способ достижения этого эффекта? Должен ли я использовать setTimeout
, чтобы медленная обработка была асинхронной и работать с обратным вызовом? Должен быть лучший способ, потому что мне действительно не нужно асинхронное поведение; Я просто хочу, чтобы интерфейс обновился.
EDIT:
JSFiddle: http://jsfiddle.net/SE8wD/5/
(Обратите внимание, что вам может понадобиться настроить количество итераций цикла, чтобы обеспечить разумную задержку на вашем собственном ПК)