アニメーションが実際に発生することを確認する唯一の方法はlongRunningMethod
、ブラウザに定期的に譲歩することです。UI レンダリング スレッドが JavaScript スレッドでブロックされることは珍しくありません。そのため、DOM に加えた変更は、次に JavaScript スレッドが解放されるまで表示されません。setTimeout
のタイムアウトで呼び出すこと0
で譲歩できます (ほとんどのブラウザーの実装では、明らかに 0 ミリ秒よりも長くなります。多くの場合、その値は少なくとも 4 ミリ秒、場合によっては 10 ミリ秒に制限されます)。
例: これは 500 の div を追加するスクリプトですが、ブラウザーに進行中の作業を表示したり (通常は) 何かをアニメーション化する機会を与えません:
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 個の div すべてとメッセージが表示されます。
すべての div間で発生する、このスペクトルのもう一方の端とは対照的です。
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);
}
});
});
ライブ例※スピナーグラフィックを使用した例
それが譲歩するので、進行中の作業を見ることができます。
2 番目のスクリプトは、同じ結果を得るのに、リアルタイムで時間がかかることに気付くかもしれません。これは、ブラウザーが表示を更新するのと同様に、生成に時間がかかるためです。実際には、最初の例と 2 番目の例の間のバランスを見つける必要があります。これは、進行状況を示すのに十分な頻度で生成されますが、プロセスが完了するまでに不必要に長い時間がかかるほど頻繁ではありません。