#javascript #jquery #html
#javascript #jquery #HTML
Вопрос:
Я пытаюсь создать счетчик jQuery, используя setInterval (), идея заключается в том, что счетчик должен начать отсчет после нажатия кнопки, а затем должен остановиться сбросить значение до нуля, если нажата другая кнопка, этот процесс должен быть повторяемым, однако мой JS, похоже, не останавливает таймер, хотя мой набор переменных отображается false
. Таймер должен засчитываться, только если это true
.
$('.start').click(function() {
timer(true)
})
$('.stop').click(function() {
timer(false)
})
let timerShouldCount = false
function timer(timerStatus) {
timerShouldCount = timerStatus
if (timerShouldCount == true ) {
setInterval(function(){
console.log('counting');
}, 1000);
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button class="start" type="button">Start</button>
<button class="stop" type="button">Stop</button>
Обновить
$('.js_ask-later').click(function() {
timer(true)
})
$('.js_close-modal').click(function() {
timer(false)
})
let registerTimer
let timerShouldCount = false
function timer(timerStatus) {
timerShouldCount = timerStatus
if (timerShouldCount == true) {
$('#login-modal').on('hidden.bs.modal', function (e) {
registerTimer = setInterval(function(){
$('#login-modal').modal('show')
}, 5000)
})
} else {
clearInterval(registerTimer)
}
}
Комментарии:
1. после того, как
setInterval
была вызвана функция, она будет повторяться до тех пор, пока не будет вызван clearInterval с идентификатором таймера.2. Нет необходимости создавать CodePen или Fiddle и ссылаться на него. Вы можете просто поместить свой код в «фрагмент» при создании вашего вопроса, и его можно запустить прямо здесь.
Ответ №1:
Вы ни в какой момент не очищаете интервал. Для этого вам нужна ссылка на созданный интервал.
let my_int;
function timer(timerStatus) {
timerShouldCount = timerStatus
if (timerShouldCount == true ) {
my_int = setInterval(function(){
console.log('counting');
}, 1000);
} else
clearInterval(my_int);
}
[ПРАВИТЬ]
Исходя из приведенных ниже комментариев, очевидно, что на самом деле у вас нет таймера, только интервал. Нам нужна переменная для таймера.
let my_int, timer = 0;
function timer(timerStatus) {
timerShouldCount = timerStatus
if (timerShouldCount == true ) {
my_int = setInterval(function(){
timer ; //<-- increment
console.log('counting');
}, 1000);
} else {
clearInterval(my_int);
timer = 0; //<-- reset to 0
}
}
Что вы будете делать с этим таймером, т. Е. где вы его показываете в DOM, зависит от вас, но вы можете, по крайней мере, увидеть, как мы увеличиваем его и сбрасываем на 0.
Комментарии:
1. Большое спасибо!
Есть ли способ снова установить таймер на ноль, или это то, что
clearInterval
делает?2.
clearInterval()
просто убивает интервал — это не имеет никакого отношения к вашему таймеру, DOM или чему-либо еще. На самом деле вы не показываете таймер в своем коде, просто интервал. Предположительно, вам нужна отдельная переменная для самого таймера. Смотрите правку через секунду…3. Проблема, с которой я сейчас, похоже, сталкиваюсь, заключается в том, что я связал это с загрузочным модалом, который после закрытия модала должен снова открыться через 5000 мс, но если я быстро закрою модал после его открытия, модал закроется, а затем появится примерно через 2500, и, в-четвертых, через 1500. Кажется, что установленный интервал ускоряется? В идеале мне нужно, чтобы он начинал интервал с 0, когда я нажимаю модальную кнопку закрытия, см. Обновленный пример кода выше.
4. Если я отклоняю свой модальный параметр, который очищает интервал, как только он открывается, тогда интервал между модальным закрытым и вновь открытым является правильным
5. Из вашего обновления кажется, что вы упускаете ту часть моего ответа, где я сбрасываю таймер на 0.