あなたはほとんどそこにいます。あなたが間違っている唯一のことは、追加するのではなく、innerHTML コンテンツを置き換えることです。これを変える:
document.getElementById('myTag').innerHTML = i;
これに:
document.getElementById('myTag').innerHTML += i;
追加/代替回答:
待って。あなたの質問を読み直したところ、別の解釈方法があることに気づきました。質問の仕方がかなり曖昧なので、上記の回答はそのままにしておきます。
for ループを処理するときに「実行中の数字」が表示されないのは、ブラウザーで JavaScript がどのように機能するかを誤解しているためです。
ブラウザのイベント ループは次のように実行されます。
1. Fetch content
2. Run javscript
3. Render content
then repeat forever
これがJavaScriptの仕組みです。したがって、あなたがやっているように単純な for ループを実行します。ブラウザーは、他に実行するものがなくなるまでスクリプトを実行します (ステップ 2)。JavaScript の実行が完了すると、レンダリング プロセスが開始されます (ステップ 3)。明らかに、この時点で の値i
は最終値であるため、最終値のみが表示されます。
ブラウザは、ページをレンダリング/更新するために JavaScript の実行を中断することはありません。では、カウントダウンタイマーなどをどのように実装するのでしょうか? イベント ループの次の反復で実行するように JavaScript の一部をスケジュールすることで、これを行います。つまり、ブラウザがステップ 3 に入り、適切なタイミングでブラウザが再びステップ 2 に入ると、必要なスクリプトが実行されます。
Javascript は基本的にこれを行う 2 つの方法を提供します: setTimeout と setInterval です。
setTimeout の仕組みは次のとおりです。
step 1. nothing to do
step 2. setTimeout schedules a piece of javascript to run at a later time
Note that the javascript does not execute yet until setTimeout
expires.
step 3. let the browser update the page
many, many loops of steps 1-3
step 2 (some time later).
setTimeout expires and the piece of javascript executes
step 3. let the browser update the page
したがって、必要な効果を得るには、次のようにする必要があります。
function foo(){
var i = 0;
var update = function(){
document.getElementById('myTag').innerHTML = i;
i++;
if (i<10000) {
setTimeout(update,100);
}
};
update();
}