Javascript, добавляющий параметр паузы в таймер обратного отсчета, не работает

У меня есть функция javascript для обратного отсчета таймера. Поэтому я хочу добавить к этой функции опцию паузы. Я пробовал вот так,

function countdownTimeStart() {

 var el = document.getElementById('demo');
 var pause= document.getElementById('pause');

 var time = [10,10,10];

 var x = setInterval(function () {

  var hours = time[0];
  var minutes = time[1];
  var seconds = time[2]--;

  if (time[2] == -1) {
      time[1]--;
      time[2] = 59 }

  function pauseTimer() {
    savedTime = time;
    clearInterval(x);
  }
  pause.addEventListener( 'click', pauseTimer);

  if ( seconds == 0 && minutes == 0 && hours == 0 ){
    clearInterval(x);
    el.innerHTML = "00:00:00";
  } else if (seconds < 10) {
    el.innerHTML = hours + ": " + minutes + ": " + "0" + seconds + " ";
  } else {
    el.innerHTML = hours + ": " + minutes + ": " + seconds + " ";
  }

}, 1000);

}

countdownTimeStart();
<button id = "pause" class = "pause">Pause</button>
<div id = "demo"></div>

Таймер обратного отсчета работает правильно. Но опция паузы не работает. Так как я могу исправить этот скрипт. Кто-нибудь может мне помочь.

addEvecancel.ntListener( 'click', pauseTimer); Орфография имеет значение.
CertainPerformance 01.05.2018 11:37

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

somethinghere 01.05.2018 11:47

Да, теперь он работает! Итак, как я могу возобновить его, когда снова нажмете кнопку паузы. Не могли бы вы добавить это как ответ, я могу отметить его как правильный ответ. Спасибо.

Chathurika 01.05.2018 11:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
500
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хотя ваш код работает, я хотел бы отметить пару вещей: добавление обработчика паузы внутри вашего interval - не лучшая идея, вы добавите обработчик паузы каждый интервал, так что в конце вы просто накапливаете сумму функций для обработки при нажатии. Я переключил вашу кнопку и выделил прослушиватель событий в функцию-обработчик, чтобы вы могли прикрепить его к любой кнопке. Эти изменения позволят вашему коду работать плавно, а также упростят его понимание:

function initCountdown() {
  
  function event_click( event ){
    
    // If our interval is null, we need to start the counter
    // And also change the innerText so its obvious what the button will do next
    
    if ( interval === null ){
      
      start();
      event.target.innerText = 'pause';
     
    } else {
      
      pause();
      event.target.innerText = 'start';
      
    }
    
  }
  
  function start(){
    
    // First use pause() to be sure all intervals are cleared
    // it prevents them from doubling up
    
    pause();
    interval = setInterval( count, 1000 );
    
  }
  function pause() {
  
    clearInterval( interval );
    interval = null;
    
  }
  function count(){
    
    // By doing this before declaring your variables
    // you make it so the variables actually hold the new calculated values.
    
    time[2]--;
    
    if ( time[2] == -1 ){
    
      time[1]--;
      time[2] = 59;
      
    }
    
    // Lets use some cool new syntax here to reduce the amount of code needed
    // this will destructure an array assigning their indexed values to the index of the variable
    
    var [ hours, minutes, seconds ] = time;

    if ( seconds == 0 && minutes == 0 && hours == 0 ){
    
      clearInterval( interval );
      
    }
    
    // We always want to print something, and if the values are 0
    // the output is still the same, so lets seperate that.
    
    if (seconds < 10) {
    
      outputElement.innerHTML = hours + ": " + minutes + ": " + "0" + seconds + " ";
      
    } else {
    
      outputElement.innerHTML = hours + ": " + minutes + ": " + seconds + " ";
      
    }
    
  }
  
  // Lets also clearly name our things.
  
  var outputElement = document.getElementById('demo');
  var toggleElement = document.getElementById('toggle');
  var interval = null;
  var time = [10,10,10];

  // Add event listener once
  
  toggleElement.addEventListener( 'click', event_click );
  toggleElement.click();
  
}

initCountdown();
<button id = "toggle">start</button>
<div id = "demo"></div>

Обновлять Добавление кнопки отмены:

function initCountdown() {
  
  function event_click_cancel( event ){
    
    pause();
    time = [ 0, 0, 0 ];
    print();
    
  }
  function event_click_startpause( event ){
    
    // If our interval is null, we need to start the counter
    // And also change the innerText so its obvious what the button will do next
    
    if ( interval === null ){
      
      start();
      event.target.innerText = 'pause';
     
    } else {
      
      pause();
      event.target.innerText = 'start';
      
    }
    
  }
  
  function start(){
    
    // First use pause() to be sure all intervals are cleared
    // it prevents them from doubling up
    
    pause();
    interval = setInterval( count, 1000 );
    
  }
  function pause() {
  
    clearInterval( interval );
    interval = null;
    
  }
  function print(){
    
    // I have separated out the print function as we want to use it
    // in the count and the cancel function
    
    var [ hours, minutes, seconds ] = time;

    if ( seconds == 0 && minutes == 0 && hours == 0 ){
    
      clearInterval( interval );
      
    }
    
    if (seconds < 10) {
    
      outputElement.innerHTML = hours + ": " + minutes + ": " + "0" + seconds + " ";
      
    } else {
    
      outputElement.innerHTML = hours + ": " + minutes + ": " + seconds + " ";
      
    }
    
  }
  function count(){
    
    // By doing this before declaring your variables
    // you make it so the variables actually hold the new calculated values.
    
    time[2]--;
    
    if ( time[2] == -1 ){
    
      time[1]--;
      time[2] = 59;
      
    }
    
    print();
    
  }
  
  // Lets also clearly name our things.
  
  var outputElement = document.getElementById('demo');
  var toggleElement = document.getElementById('toggle');
  var cancelElement = document.getElementById('cancel');
  var interval = null;
  var time = [10,10,10];

  // Add event listener once
  
  toggleElement.addEventListener( 'click', event_click_startpause );
  toggleElement.click();
  
  cancelElement.addEventListener( 'click', event_click_cancel );
  
}

initCountdown();
<button id = "toggle">start</button>
<button id = "cancel">cancel</button>
<div id = "demo"></div>

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

Chathurika 01.05.2018 12:02

@Chathurika Да, это так, позвольте мне внести небольшую поправку!

somethinghere 01.05.2018 12:03

отличное решение

A.A Noman 01.05.2018 12:12

Большое спасибо за ваш ответ, действительно полезно.

Chathurika 01.05.2018 12:14

@Chathurika Я изменил свое решение, чтобы добавить переключатель, опять же, отделенный, поскольку он делает ваш код более многоразовым и, честно говоря, более читаемым и поддерживаемым. Удачи!

somethinghere 01.05.2018 12:14

Я очень ценю вашу помощь и отличную работу

Chathurika 01.05.2018 12:15

@somethinghere Я попытался добавить сюда опцию отмены, но тогда скрипт не работает, нельзя ли здесь использовать опцию отмены?

Chathurika 01.05.2018 13:20

@Chathurika Что должна делать твоя отмена? Это отдельная кнопка сбрасывает таймер? Что убирает таймер? Что вы пытаетесь достичь?

somethinghere 01.05.2018 13:22

Это отдельная кнопка, при нажатии на нее время должно быть 00:00:00 с остановкой отсчета.

Chathurika 01.05.2018 13:23

<button id = "cancel"> Отменить </button>

Chathurika 01.05.2018 13:24

@Chathurika Я обновил свой пост примером отмены. Это заставило меня выделить функцию print, поскольку теперь мы хотим использовать ее где-нибудь еще, а не только в таймере.

somethinghere 01.05.2018 13:32

Спасибо отличная работа

Chathurika 01.05.2018 13:36

@somethinghere есть некоторые проблемы этого скрипта, которые я не мог решить самостоятельно. Эта функция обратного отсчета времени также проходит через минусовое значение, поэтому я хочу прекратить отсчет, когда наступит 00:00:00, не могли бы вы помочь мне решить эту проблему.

Chathurika 03.05.2018 08:16

@Chathurika Это выходит за рамки вопроса, и мне кажется, что я просто делаю этот проект для вас. Однако в моем тестировании счетчик останавливается на нуле, поэтому я не вижу этой проблемы.

somethinghere 03.05.2018 08:33

Да вы правы, я сам исправлю. Спасибо.

Chathurika 03.05.2018 08:34

Другие вопросы по теме