简体   繁体   中英

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:)

 $(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>

To add another answer to this question...

No dependencies (jQuery,Moment.js) and only for 24 hour duration (days,months,years are not calculated).

 function countDown(elClass) { let labels = document.querySelectorAll(elClass); let now = Date.now(); labels.forEach((label,key) => { let duration = document.getElementById(label.getAttribute('for')).value; if(duration <= 86400000) { let futureDate = now + parseInt(duration); let counterInterval = setInterval(() => { let diff = futureDate - Date.now(); if(diff <= 0) { clearInterval(counterInterval); return; } if(diff > 0) { let milliseconds = diff%1000; let seconds = parseInt(diff/1000)%60; let minutes = parseInt(diff/(60*1000))%60; let hours = parseInt(diff/(60*60*1000))%24; label.innerHTML = hours.toString().padStart(2, '0')+':'+minutes.toString().padStart(2, '0')+':'+seconds.toString().padStart(2, '0')+'<br>'; } },1000); } }); } countDown('.countdown');
 <input type="hidden" name="a" id="a" class='duration' value="5000"><label for="a" class="countdown"></label> <input type="hidden" name="b" id="b" class='duration' value="15000"><label for="b" class="countdown"></label> <input type="hidden" name="c" id="c" class='duration' value="190000"><label for="c" class="countdown"></label> <input type="hidden" name="d" id="d" class='duration' value="2003200"><label for="d" class="countdown"></label> <input type="hidden" name="e" id="e" class='duration' value="20067100"><label for="e" class="countdown"></label> <input type="hidden" name="f" id="f" class='duration' value="86023104"><label for="f" class="countdown"></label>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM