Пауза и повтор обратного отсчета jQuery

#jquery #mouseevent #counter #keyboard-events

#jquery #mouseevent #счетчик #клавиатура-события

Вопрос:

Я пытаюсь закодировать какую-то функцию для страницы, но я не могу собрать воедино все части:-(

Все, что мне нужно, это простой счетчик, который считает до 0, а затем показывает сообщение (.подтверждение). При прерывании работы (перемещении мыши или касании keyobaord) счетчик приостанавливается и показывает другое сообщение (.warning), а через несколько секунд повторите отсчет с начала. Уф…

У меня есть элемент для мониторинга действий пользователя и продолжения, но я не знаю, как добавить это вместе:

        //monitors user action
        $('.warning, .confirmation').hide();

        $(document).bind('mousemove keydown', function() {
            $('.warning').show().delay(2000).fadeOut(500);
        }); 

        //counts for example from 5 seconds (this value is in the <span></span> in html section) 
        var sec = $('#box span').text()
        var timer = setInterval(function() {
           $('#box span').text(--sec);
           if (sec == 0) {
              $('.confirmation').show(function() {
                $(document).unbind();
              });
              clearInterval(timer);
           }
        }, 1000);
  

Ответ №1:

Попробуйте что-то подобное:

         //countdown pause timer
        var countDownPauseTimer = 0;
        
        //monitors user action
        $('.warning, .confirmation').hide();

        $(document).bind('mousemove keydown', function() {
            countDownPauseTimer = 10; // Countdown will pause for 10 seconds
            $('.warning').show().delay(2000).fadeOut(500);
        }); 

        //counts for example from 5 seconds (this value is in the <span></span> in html section) 
        var sec = $('#box span').text()
        var timer = setInterval(function() {
           if (countDownPauseTimer > 0)
                countDownPauseTimer--;
           else
                $('#box span').text(--sec);
           if (sec == 0) {
              $('.confirmation').show(function() {
                $(document).unbind();
              });
              clearInterval(timer);
           }
        }, 1000);
  

Что я здесь сделал, так это ввел другую переменную, чтобы указать, что мы приостанавливаем обратный отсчет, и удерживать количество секунд, оставшихся для паузы.

В интервале я проверяю, есть ли пауза, и решаю, какое значение уменьшить…

Я не тестировал это, но это должно сработать.

Обновить

Ниже приведен обновленный код с перезапуском обратного отсчета после окончания паузы:

         //countdown pause timer
        var countDownPauseTimer = -1;
        
        //monitors user action
        $('.warning, .confirmation').hide();

        $(document).bind('mousemove keydown', function() {
            countDownPauseTimer = 10; // Countdown will pause for 10 seconds
            $('.warning').show().delay(2000).fadeOut(500);
        }); 

        //counts for example from 5 seconds (this value is in the <span></span> in html section) 
        var sec = $('#box span').text();
        var timer = setInterval(function() {
           if (countDownPauseTimer > 0)
                countDownPauseTimer--;
           else if (countDownPauseTimer == 0) {
                countDownPauseTimer--;
                sec = $('#box span').text();
           }
           else
                $('#box span').text(--sec);
           if (sec == 0) {
              $('.confirmation').show(function() {
                $(document).unbind();
              });
              clearInterval(timer);
           }
        }, 1000);
  

Комментарии:

1. Все работает отлично, но вместо паузы и перезапуска счетчика после перемещения мыши / клавиатуры он по-прежнему равен 0 🙁

2. о, не видел, что вы хотели перезапустить обратный отсчет с самого начала, я обновлю ответ с желаемым поведением

3. Хммм … что-то не так, потому что номер не хочет перезапускаться, когда вы прерываете подсчет:-/ jsfiddle.net/cachaito/8d7fJ/3

4. о, очевидно… Я не заметил, что мы обновляем число в промежутке. Я исправил это в своем jsFiddle здесь: jsfiddle.net/HFchz/2

5. Это почти идеально :-). Но я не знаю, почему цифры всегда возвращаются к 19 вместо 20 с начала?