1

以下のコードは、div要素を新しいテキストで定期的に更新します。Chromeデバッガーにブレークポイントを設定し、ステップモードで実行すると、コードは期待どおりにhtmlを更新します。しかし、ブレークポイントを設定せずに実行すると、次のように表示されます。

分=0秒=0

印刷された後、変更はありません。

私は何が間違っているのですか?

<html>
<script type="text/javascript">
var g_t1 = null;
var g_t2 = null;

function StartTimer() {
   g_t1 = new Date();
}

function StopTimer() {
   g_t2 = new Date();
}

function CalcDuration() {
   StopTimer();

   var diff = g_t2.getTime() - g_t1.getTime();
   var place = document.getElementById("here");
   var minutes = Math.floor((diff / 1000) / 60);
   var seconds = Math.floor((diff / 1000) % 60);
   place.innerHTML = "minutes = " + minutes + " seconds = " + seconds;

   window.setTimeout(CalcDuration(), 100);
}

function Poller() {
   if(!g_t1)
     StartTimer();

   window.setTimeout(CalcDuration(), 100);
}

</script>
<body onload="Poller();">
<div id="here"></div>
</body>
</html>

編集。

興味のある人は、これらの両方のバリアントが機能します。

window.setTimeout(CalcDuration, 100);

また

window.setTimeout(function(){CalcDuration()}, 100);
4

2 に答える 2

1

タイマー関数呼び出しを無名関数でラップする必要があります。そうしないと、タイマーのスコープ内ではなく、すぐに実行されます。

window.setTimeout(function(){CalcDuration()}, 100);
于 2013-01-18T15:14:20.123 に答える
0

setTimeoutがデバッグモードで機能するが、本番環境では機能せず、関数参照構文を使用する場合。

window.setTimeout(CalcDuration, 100);

次に、次のように関数を定義していることを確認する必要があります。

CalcDuraction = function() {
   ...
}

それよりも

function CalcDuration() {
   ...
}
于 2017-05-03T11:59:59.540 に答える