2016-08-19 23 views
0

インデックスiを持つ配列をループしようとしています。 現在、5秒ごとにiをインクリメントしています。キーを押した後にsetIntervalタイマーを再起動

しかし、私は手動で増分するオプションを追加したいと考えていますi、タイマーを5秒(5000)にリセットする必要があります。これをどのようにして成功させるのですか?

ので、例えば、

[a, b, c, d, e, f, g] 

スタートで私は右矢印キーを押すと、それが表示されるはずです(または私は後で選ぶどんな機能)「A」、5秒待って、ディスプレイ「B」 直ちに "c"に移動する必要がありますが、もう一度 - >を押すまで5秒待ってください。

私は別の機能にインクリメントを入れようとしましたが、これはあまりうまく機能しませんでした。

function doThis() { 
if (i < (l + 1)) { 
         $('#myDiv').html(myArray[i]); 

         i++; 
         if (i == (l + 1)) { 
          doNext(); 
         } 
        }} 

        var intervalHandle = setInterval(doThis, 5000); // start the interval by default 
        var running = true; // true if the interval is running, false if its not. 




          $("body").keydown(function (e) { 
           if (e.keyCode == 39) {//right 

            console.log("testing"); 
            if (running) { 
             clearInterval(intervalHandle); // stop interval 
             running = false; // mark interval as stopped 
            } else { 
             intervalHandle = setInterval(doThis, 5000); // start interval 
             running = true; // mark interval as started 
             doThis(); // also change the image right now 
            } 


           } else { 
            e.preventDefault(); 
           } 

          }); 

function doNext(){ 
//something here, when i ==l+1 as noted above 
} 
+0

提案:ユーザーが何かを表示することを選択した場合は、タイマーを完全に停止します。彼らは遅く読んで5秒以上を必要とするかもしれません、そして、彼らは明らかに彼らが手動でそれを制御する方法を知っていることを示しました。 – zzzzBov

答えて

1

一つの可能​​な解決策は、あなたがたsetIntervalを呼び出してから、間隔をリセットし、合格をインクリメントするために使用できる関数を返す関数を呼び出しますのsetIntervalではなく、直接呼び出す閉鎖であなたの仕事をラップすることです値で。

function startInterval(i) { 
    var interval = setInterval(function() { 
    i++ 
    }, 5000); 

    return function() { 
    clearInterval(interval) 
    i++; 
    interval = setInterval(function() { 
    i++ 
    }, 5000); 
    } 
} 

var i = 0; 
var manualIncrement = startInterval(i); 

$('body').keydown(function(e) { 
    if(e.keyCode === 39) { 
    manualIncrement(); 
    } else { 
    e.preventDefault(); 
    } 
}) 
+0

@mkalishありがとうございました!私はまだ少し混乱しています。 manualIncrementはどこから始まりますか? –

+0

@turner返された 'manualIncrement'関数がどこで呼び出されるかを示す例を更新しました。 – mkalish

+0

もう一度ありがとう!上記のコードを更新しました。 あなたが書いたものを試しましたが、それは私のために働くようには見えなかったので、私は別の方法でアプローチしました。それはまだ動作しません。あなたはさらにコメントがあれば、それは非常に感謝します。 –

関連する問題