【问题标题】:how to implement multiple countdowns on the same DOM element如何在同一个 DOM 元素上实现多个倒计时
【发布时间】:2019-10-09 21:24:01
【问题描述】:

我有一个 DOM 元素,其中包含来自我的数据库的值(毫秒),我想为这些值实现倒计时。例如,我可以在一个部分中有 4 个产品交易,以毫秒为单位的持续时间不同,我想根据每笔交易的持续时间动态创建不同的倒计时(HH:mm:ss)。 目前,持续时间值(毫秒)存储在该部分中每个交易的隐藏输入字段中。

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

我尝试过的(仅适用于一项产品交易)。在此期间我使用了moment.js。还有这里的倒计时:

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

非常感谢:)

【问题讨论】:

  • 你需要遍历它。到目前为止你有没有尝试过?
  • 是的,Ikr,我似乎无法理解它
  • 元素的id属性应该是唯一的。 $('#duration') 只需选择一个。如果你有很多durationcountdown,使用一个类更合适。你能粘贴你的html代码吗?

标签: javascript jquery html countdown countdowntimer


【解决方案1】:

要为这个问题添加另一个答案...

没有依赖项(jQuery、Moment.js)并且仅持续 24 小时(不计算天、月、年)。

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>

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢。我试过这个解决方案。它可以工作,但您必须刷新页面 4-6 次才能开始显示正确的分配时间。
    • 我还注意到,在 3 次产品交易后,它停止工作
    • 我相信这是我的问题,因为我正在向数据库发送查询以每毫秒更新毫秒的持续时间
    • 关于启动问题,也许你应该等待一些ajax响应而不是听document'ready事件。关于更新问题,如果你需要这么高的延迟,你应该使用 websockets。
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多