Search code examples
javascriptjqueryhtmlcountdowncountdowntimer

how to implement multiple countdowns on the same DOM element


I have a DOM element, that contains values (milliseconds) from my database, and I want to implement a countdown for the values. For example, I can have 4 product deals in a section, with different duration in milliseconds, and i want to dynamically create different countdowns(HH:mm:ss) for each deal according to its duration. Currently, the duration values (milliseconds) are stored in a hidden input field for each deal in the section.

<input type="hidden" name="" id='duration' value="{{this.deals.duration}}">

What i tried (it works fine for only one product deal). I used moment.js for the duration. and also for the countdown here:

<script type="text/javascript">
  $(document).ready(function(){
    console.log($('#duration').val());
    var interval = 1000;
    var durations = $('#duration').val();
    setInterval(function(){
      durations = moment.duration(durations - interval, 'milliseconds');
       // console.log(durations);
      $('#countdown').text(durations.hours() + ":" + durations.minutes() + ":" + durations.seconds())
    }, interval);
  })


</script>

Thanks very much :)


Solution

  • $(document).ready(function(){
      var interval = 1000;
      setInterval(function(){
        $('.duration').each(function () {
          var t = Number($(this).val()) - interval;
          if (t>=0) {
            var d = moment.duration(t, 'milliseconds');
            $(this).next('.countdown').text([
              String(d.hours()).padStart(2,'0'),
              String(d.minutes()).padStart(2,'0'),
              String(d.seconds()).padStart(2,'0')
            ].join(':'));
            $(this).val(t);
          }
        });
      }, interval);
    })
    input + span {
      display: block;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment-with-locales.min.js"></script>
    
    <input type="hidden" name="a" class='duration' value="5000"><span class="countdown"></span>
    
    <input type="hidden" name="b" class='duration' value="15000"><span class="countdown"></span>
    
    <input type="hidden" name="c" class='duration' value="20000"><span class="countdown"></span>