ダグラス・クロフォードの「JavaScript:The Good Parts」を読んだ後、私はこのようなタイマーを実装しようとしました。これは、プライベート変数(秒、時間、分)と3つのpublicメソッドがあります、開始、停止および継続:機能継承を使用しているときにsetTimeoutが機能しない
var timer = function() {
var that = {};
var seconds = 0;
var hours = 0;
var minutes = 0;
var myTimer;
that.getTime = function() {
var time = hours + " : " + minutes + " : " + seconds;
return time;
}
that.start = function() {
seconds += 1;
if(seconds >= 60) {
seconds -= 60;
minutes += 1;
}
if(minutes == 60)
hours += 1;
document.getElementById('hours').innerHTML = hours;
document.getElementById('minutes').innerHTML = minutes;
document.getElementById('seconds').innerHTML = seconds;
myTimer = setTimeout(function() {
start();
}, 1000);
};
that.stop = function() {
clearTimeout(myTimer);
}
that.reset = function() {
seconds = 0;
hours = 0;
minutes = 0;
clearTimeout(myTimer);
document.getElementById('hours').innerHTML = hours;
document.getElementById('minutes').innerHTML = minutes;
document.getElementById('seconds').innerHTML = seconds;
}
return that;
};
をしてから、私はそれを開始しました:
<body onload="var t = timer();t.start();">
<h1>Digital Clock</h1>
<div id="wrap">
<div>
<ul>
<li id="hours"></li>
<li> : </li>
<li id="minutes"></li>
<li> : </li>
<li id="seconds"></li>
</ul>
</div>
</div>
<br/>
</body>
誰が何をしたか、エラーを教えてもらえます私が作る ?
更新:最後に、私はあなたが別の関数(たとえば、内部機能)、「これは」、グローバルにバインドされていない外側の関数内から関数を使用するproblem.Whenを見つけました。したがって、文start()では、jsはグローバルオブジェクト内の関数を検索しようとします。もちろん、このような機能はありません。ここで、私は2つの解決策が見つかりました:
使用
myTimer =のsetTimeout(; 1000関数(){ that.start()}) "ことを"。
保存コンテキスト:
するvar timerInstance =この;
myTimer = setTimeout(function(){ timerInstance.start(); }、1000);
希望すると、これが役立ちます。私は「この」で(「これは」あなたのタイマーを表します)「ということ」に置き換えてきましたし、「VaRのタイマー」i「は、ウィンドウを使用しました代わりにhttp://jsfiddle.net/6YWLJ/
:ここ
あなたは**コンソールを使用する方法を学ぶ必要があります**:「.timer
後の編集あなたのプログラムによってどのようなエラーが生成されているのかを確認してください。通常は、ブラウザ(またはGoogle)内のF12キーを押してこれを行うことができます。 * one *の場合は、 'start()'ではなく 'start()'と 'continue()'関数内で 'this.start()'を使うべきです。また、 'setTimeout()'の結果を 'myTimer'に代入して' stop() '関数を正しく動作させる必要があります。 – Matt
@Mattこの特定のインスタンスでは、 'this.start()'ではなく 'that.start()'です。継承のこの実装は絶対に不必要です、私は確信していません、なぜ彼らはこれを教えています。 – joncys
@joncys:確かにあなたは正しいです。私は元のコメントを修正することはできませんが、今は5分のウィンドウの外にあります:) – Matt