Попытка приостановить setinterval на 10 секунд при нажатии кнопки
Я пытаюсь временно приостановить setInterval
когда нажата кнопка "Далее". В настоящее время он останавливает текущий setinterval, но не запускает его снова через 10 секунд.
У меня есть простой ротатор изображения, который меняет изображение каждые 4 секунды. Когда нажата кнопка "Далее", я хочу, чтобы она приостановила интервал на 10 секунд, прежде чем снова начать вращение на 4 секунды.
Вот код на данный момент (был упрощен):
var ic = $('#imageContainer');
var numItems = $('.image').size();
var position = 0;
ic.css('left', '0px');
var inter;
function rotate() {
inter = setInterval(function () {
if (position == (numItems - 1)) {
console.log(position);
$('.image').first().insertAfter($('.image').last());
ic.css('left', '+=400px');
position--;
}
ic.animate({
left: "-=400px"
});
position += 1;
}, 4000);
}
rotate();
$('#next').click(function () {
clearInterval(inter);
nextInter = setInterval(function () {
rotate();
}, 10000);
clearInterval(nextInter);
});
3 ответа
Это происходит потому, что вы очищаете nextInter
только одна строка после того, как вы его создали.
nextInter = setInterval(function(){rotate();}, 10000 );
clearInterval(nextInter);
Однако, если вы удалите последний clearInterval
, ваш nextInter
интервал позвонит rotate
каждые 10 секунд, это будет устанавливать новый интервал каждые 4 секунды. Это, безусловно, вызовет неожиданное поведение. Я думаю, что вы ищете setTimeout
вместо.
$('#next').click(function () {
clearInterval(inter);
setTimeout(rotate, 10000);
});
Кроме того, если вы хотите предотвратить выполнение нескольких rotate
Если вы нажимаете следующую кнопку несколько раз, вы можете создать переменную вне области обратного вызова, чтобы сохранить setTimeout
экземпляр, а затем очистить его при нажатии кнопки. Пример:
var rotateTimeout;
$('#next').click(function () {
clearInterval(inter);
clearTimeout(rotateTimeout);
rotateTimeout = setTimeout(rotate, 10000);
});
После составления графика nextInter
Вы очищаете его вскоре после того, как оно выполнено.
Здесь вам нужно установить setTimeout() вместо setInterval (). Вам нужно было вызвать rotate через 10 секунд, но setInterval будет вызывать его каждые 10 секунд, поэтому вы очищали его, но проблема заключалась в том, что вы очищали его до того, как он смог выполнить rotate хотя бы один раз.
$('#next').click(function () {
clearInterval(inter);
setTimeout(rotate, 10000 );
});
Вы можете сделать это используя setTimeout
:
$('#next').click(function () {
clearInterval(inter);
nextInter = setTimeout(rotate, 10000);
});