按下后重新启动setInterval计时器

时间:2016-08-19 01:44:27

标签: jquery arrays settimeout setinterval clearinterval

我正在尝试循环索引i的数组。 它目前每5秒增加i

但是,我想添加手动递增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 
}

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是将您的工作包装在一个闭包中,而不是直接调用setInterval,您将调用一个函数来调用setInterval,然后返回一个可用于重置间隔并增加传入值的函数。 / p>

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();
  }
})