Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to display counter value into the output to start a countdown

Tags:

javascript

I'm building a counter and have some issue with. I have a counter field where increment and decrement happen (by default it's 5 minutes). When 'start' button is pressed the final counter's digit should be set as the timer in the output field. here is my solution:

;(function(){
  var output = document.querySelector('#output'),
    btn = document.querySelector('button'),
    min = 5,
    sec = min * 60,
    timer;

setCount(min);

  function setCount(n){
    var c = document.querySelector('#counter'),
        increment = c.children[1].children[0],
        decrement = c.children[1].children[2],
        num  = c.children[1].children[1];      

    increment.onclick = function(){
      if(n >= 1) {num.textContent = ++n;}
    };  

    decrement.onclick = function(){
      if(n > 1) {num.textContent = --n;}
    };  
    num.textContent = n;
   }

  function setTimer(){

    var currentMin = Math.round((sec - 30) / 60),
        currentSec = sec % 60;

    if(currentMin >= 0 ) {currentMin = '0' + currentMin;}
    if(currentSec <= 9 ) {currentSec = '0' + currentSec;}  
    if(sec !== 0){sec--;}
    timer = setTimeout(setTimer,10);  // 10 is for the speedy
    output.textContent = currentMin + ':' + currentSec;  
  }

  btn.addEventListener('click', setTimer, false);
  })();

here is the link : JS Bin

like image 951
Bogdan Avatar asked Dec 21 '15 23:12

Bogdan


1 Answers

TL;DR

if(n >= 1) {num.textContent = ++n; sec = n * 60;} // Line 15
...
if(n > 1) {num.textContent = --n; sec = n * 60; } // Line 19

Your timer is deriving it's start min value from the seconds, which is always equal to 5 * 60. You need to update the seconds every time that the + or - is clicked.

(function() {
  var output = document.querySelector('#output');
  var btn = document.querySelector('button');
  var min = 5;
  var sec = min * 60;
  var timer;

  var counter = document.querySelector('#counter ul');
  var increment = counter.children[0];
  var decrement = counter.children[2];
  var number = counter.children[1];
  number.textContent = min;

  increment.onclick = function() {
    min++;
    number.textContent = min;
    sec = min * 60;
  };

  decrement.onclick = function() {
    min--;
    if (min < 1) {
      min = 1;
    }
    sec = min * 60;
    number.textContent = min;
  };

  function setTimer() {
    var currentMin = Math.round((sec - 30) / 60),
      currentSec = sec % 60;

    if (currentMin == 0 && currentSec == 0) {
      output.textContent = '00:00';
      return;
    } else {
      timer = setTimeout(setTimer, 10);
    }

    if (currentMin <= 9) {
      currentMin = '0' + currentMin;
    }
    if (currentSec <= 0) {
      currentSec = '0' + currentSec;
    }
    if (sec !== 0) {
      sec--;
    }
    output.textContent = currentMin + ':' + currentSec;
    console.log('currentMin: ' + currentMin);
  }

  btn.addEventListener('click', setTimer, false);

})();
#wrapper {
  width: 300px;
  border: 1px solid #f00;
  text-align: center;
}
#output {
  height: 40px;
  line-height: 40px;
  border-bottom: 1px solid #f00;
}
h4 {
  margin: 10px 0;
}
ul {
  margin: 0;
  padding: 0;
}
li {
  list-style: none;
  width: 40px;
  height: 40px;
  line-height: 40px;
  display: inline-block;
  border: 1px solid #f00;
}
li:nth-child(odd) {
  cursor: pointer;
}
button {
  padding: 5px 15px;
  margin: 10px 0;
}
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>

<body>
  <div id="wrapper">
    <div id="output"></div>
    <div id="counter">
      <h4>counter</h4>
      <ul>
        <li>+</li>
        <li></li>
        <li>-</li>
      </ul>
    </div>
    <button id="start">start</button>
  </div>
</body>

</html>
like image 194
sdc Avatar answered Sep 26 '22 14:09

sdc