Запуск / остановка / сброс счетчика jQuery не останавливается корректно

#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.