@Parth が指摘したように、ブラウザーは javascript を単一のスレッドで実行するため、<div>
オーバーレイが存在しない場合、UI イベントはトリガーされますが、長時間実行される関数が完了するまでキューに残ります。ただし、通常、この動作は想定されていません。UI をフリーズしたい場合は、<div>
オーバーレイを保持してください。
ブラウザーに UI を更新する機会を与える (またはユーザーが処理をキャンセルできるようにする) 場合は、実行時間の長い関数ロジックをさまざまな関数呼び出しに分割し、window.setTimeout calls
. このパターンを実装するにはいくつかの方法がありますが、私は非再帰的なクロージャ キュー アプローチが好きです。
// this will block UI until all images are painted:
function paintAll(arImg) {
for(var i=0; i<arImg.length; i++) paintSingle(arImg[i]);
}
// this will block UI only while each image is painted:
function paintAll(arImg) {
// copy arImg to queue not to modify the input parameter
var queue = arImg.slice(0);
// apply the paint function to the first element, remove it from queue
// and set the runner function to run again after 5 milliseconds
// (this will allow the UI thread to run between each runner call)
var runner = function() {
// check any UI based condition to abort running:
if(!checkUiBasedCondition()) return;
if(!queue.length) return;
paintSingle(queue.shift());
window.setTimeout(runner, 5);
}
// call runner to initiate the processing
runner();
}
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/shift
https://developer.mozilla.org/en/DOM/window.setTimeout