Перезапустите setInterval таймер после нажатия клавиши
Я пытаюсь перебрать массив с индексом i
, Что это в настоящее время увеличивает i
каждые 5 секунд.
Однако я хочу добавить опцию ручного увеличения 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 ответ
Одно из возможных решений - обернуть вашу работу в замыкание, где вместо непосредственного вызова 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();
}
})