2017-02-14 22 views
1

私はJavaScriptの学習を始めました。単純なカウントダウンタイマーを試してみることを考えましたが、わかりません。印刷するjavascriptのsetTimeout

function countdown() { 
 
    var count1 = 10; 
 
    while (count1 >= 0) { 
 
    setTimeout(function() { 
 
     document.getElementById("main").innerHTML = count1; 
 
    }, 1000); 
 
    count1--; 
 
    } 
 
}
<p id="main" onload="countdown()"></p>

ページだけを停止する/ハング。何が問題なの?

+0

この –

+0

のために私が '' p'要素のonLoad'は何もしないと思います使用し 'たsetInterval(関数(){...})'。私はあなたのページが停止しているとは思っていません。それは始めるために何もしていない。 'document.addEventListener( 'DOMContentLoaded'、countdown);'を追加すると、残りのロジックをデバッグできます。 –

+0

[シンプルなJavaScriptのカウントダウンタイマーのコードは?](http://stackoverflow.com/questions/1191865/code-for-a-simple-javascript-countdown-timer) –

答えて

2

タイマーにsetIntervalを使用し、カウントダウンが0になるとクリアします。すぐに呼び出される匿名関数を使用するか、定義時にすぐに名前付き関数を実行してください。あなたの関数は他には実行されないので、あなたのためのタイマーはありません。それはsetIntervalによって呼び出される関数内で起こるはずregularyと呼ばれ、(カウンタをdecreading)カウントダウンしますので

function countdown() { 
 
    var count1 = 10; 
 
    var myTimer = setInterval(function() { 
 
    document.getElementById("main").innerHTML = count1; 
 
    count1--; 
 
    if (count1 == 0) { 
 
     clearInterval(myTimer); 
 
    } 
 
    }, 1000); 
 
} 
 
countdown();
<div id="main"></div>

+1

コードを改善したい場合があります。それはそのままで、問題の元のコードよりもうまく動作しません。 –

+0

これは実際には機能すると思いますか? –

+0

これで、今はもっとうまくいく – Merigold

0

あなたは、代わりにsetIntervalを使用する必要があります。ループを省略して、カウンタが0になったときにclearIntervalを呼び出すことができます。

0

setTimeoutはこの関数を1回だけ実行します。 setIntervalを使用するとここで手助けできます。

もう1つ注目すべき点は、変数のスコープについてです。 setTimeOutが1秒間待機している間に、whileループは実行し続け、count1の値を変更します。

count1の値は常に-1になります。 Immediately Invoked Function Expression(IIFE)を使用することが必要です。

function countdown() 
{ 
    var count1 = 10; 
    while(count1 >= 0) { 
     var myTimer = setInterval((function() { 
     console.log(count1); 
     }(count1)), 1000); 
     count1 = count1 - 1; 
    } 
} 
countdown() 

Jsfiddle

+1

コードを再チェックする必要があります。つまり、whileループで直ちに10個の 'setInterval'をすべて呼び出すことを考えれば、OPが望むことは間違いありません。 – user3707125

+0

@Hozefa説明をありがとうが、コードが間違っています。 – ssh

+0

@pshああ、間違いがある。しかし、私はそのコンセプトを大きく – Hozefa