Единственный способ убедиться, что анимация на самом деле происходит, - это чтобы longRunningMethod
периодически передавался браузеру.Нередко поток рендеринга пользовательского интерфейса блокирует поток JavaScript, поэтому изменения, которые вы вносите в DOM, не отображаются до тех пор, пока в следующий раз не выйдет поток JavaScript.Вы можете выйти, вызвав setTimeout
с таймаутом 0
(который будет больше 0 мс - очевидно - в большинстве реализаций браузера; многие ограничивают это значение по крайней мере до 4 мс и, возможно, до 10 мс).
Пример: вот скрипт, который добавляет 500 делений, но не дает браузеру никакой возможности показывать текущую работу или (обычно) анимировать что-либо:
jQuery(function($) {
$("#btnGo").click(function() {
var n;
display("Loading...");
for (n = 0; n < 500; ++n) {
$("<div/>").html("Div #" + n).appendTo(document.body);
}
display("Done loading");
function display(msg) {
$("<p/>").html(msg).appendTo(document.body);
}
});
});
Живой пример * Пример с графикой счетчика
Как видите, он никогда не сдается, и поэтому, когда вы нажимаете кнопку, страница на мгновение останавливается, а затем появляются все 500 делений и сообщения.
Контраст с этим другим концом спектра, который дает между каждым делением :
jQuery(function($) {
$("#btnGo").click(function() {
display("Loading...");
addDivs(0, 500, function() {
display("Done loading");
});
function addDivs(current, max, callback) {
if (current < max) {
$("<div/>").html("Div #" + current).appendTo(document.body);
setTimeout(function() {
addDivs(current + 1, max, callback);
}, 0);
}
else {
callback();
}
}
function display(msg) {
$("<p/>").html(msg).appendTo(document.body);
}
});
});
Живой пример * Пример с вращателемgraphic
Так как это дает, вы можете видеть незавершенную работу.
Вы можете заметить, что второй сценарий занимает больше времени, возможно, намного больше, в реальном времени, чтобы достичь того же результата.,Это связано с тем, что выходы занимают время, так же как и браузер, обновляющий отображение.На практике вы захотите найти баланс между первым примером и вторым - что-то, что дает достаточно часто, чтобы показать прогресс, но не так часто, что процесс занимает неоправданно много времени.