(一番下のアップデートを参照してください)
私は何十もの質問を見てきましたが、これを機能させることができませんでした。
以下のコードが与えられた場合、反復ごとに単純な進行状況インジケーター ($("#log")) を強制的に更新するにはどうすればよいですか?
編集:この JSFiddle は私の問題を例示していると思います: http://jsfiddle.net/kPRky/
これはHTMLです:
<div id="test"></div>
<div id="log"></div>
これは、関数が呼び出される方法です。
$("#test").html(createLevelMap());
そして、これが関数です
function createLevelMap() {
var height = 300;
var width = 1000;
var totalpixels = height * width; //used for calculating loading percentages;
var currentpixel = 0; //used for calculating loading percentages;
var x = 0;
var y = 0;
//lots of other variables
for (x = 0; x < width; x += 1) {
for (y = 0; y < height; y += 1) {
//lots of calculations with lots of variables
currentpixel += 1;
$("#log").html((currentpixel / totalpixels) * 100 + "%");
}
}
return ('done'); //actually returns a very long base64 encoded string
}
アップデート
単純化して、グリッド全体ではなく各列をレンダリングする個別の関数を用意しました。ただし、setTimeout を使用しても、進行状況が正しく表示されません。
for (x = 0; x < width; x += 1) {
$("#log").html(((x + 1) / width) * 100 + "%<br>(sliver " + (x + 1) + "/" + width + ")");
setTimeout(createSliver(x), 100);
}
^^これにより、期待どおりの出力が得られますが、パーセンテージは更新されません。setTimeout(function() { createSliver(x) }, 100); に変更しました。コメントで推奨されているように、出力も得られません(まだパーセンテージも増加しません)。