Javascript JS setInterval()函数无法正确启动
我是JS新手,正在调试一段我没有编写的代码。 我正在做一个项目,我们需要处理一些基于交易的报价。DOM中的每个deal元素都有一个个人到期时间,我们使用倒计时来跟踪该时间。 以下是包含计时器的html页面(Django模板):Javascript JS setInterval()函数无法正确启动,javascript,jquery,django,Javascript,Jquery,Django,我是JS新手,正在调试一段我没有编写的代码。 我正在做一个项目,我们需要处理一些基于交易的报价。DOM中的每个deal元素都有一个个人到期时间,我们使用倒计时来跟踪该时间。 以下是包含计时器的html页面(Django模板): <div class="countdown"> <span class="countdown-time" data-remaining="{{ running_time }}"></span> {% if dea
<div class="countdown">
<span class="countdown-time" data-remaining="{{ running_time }}"></span>
{% if deal.is_normal %}
<i class='fa fa-gavel'></i>
{% elif deal.is_group%}
<i class='fa fa-users'></i>
{% elif deal.is_booking %}
<i class='fa fa-pencil-square-o'></i>
{% endif %}
</div>
<script type="text/javascript">
function displayRange(seconds) {
if (seconds <= 0) {
return 'expired';
}
var count = seconds;
hours = Math.floor(count/(60 * 60));
count = count - hours * (60 * 60);
minutes = Math.floor(count/60);
seconds = count - minutes * 60;
return sprintf("%02d", hours) + ':' + sprintf("%02d", minutes) + ":" + sprintf("%02d", seconds);
}
$('.countdown-time').each(function(index, el) {
var that = $(this);
var _el = el;
var intervalID = setInterval(function() {
var remaining = parseInt(_el.getAttribute('data-remaining'));
var delta = Math.floor(new Date().getTime()/1000) + remaining;
console.log(' delta ' + delta +' remaining= ' + remaining + ' that=' + that + ' _el ' + _el + ' index ' + index);
that.html(displayRange(remaining));
_el.setAttribute('data-remaining', remaining - 1);
if(remaining < 0) {
clearInterval(intervalID);
}
}, 1000);
});
</script>
类为“倒计时”的每个DOM元素。
我期望的是倒计时计时器每秒钟一步,并在相应的交易元素布局中显示结果
对于每个具有索引的元素,实际情况是setinterval()并行激发
total_number_of_deal_elements_in_the_DOM - index
每秒10次。例如,如果我总共有5个deal元素(DOM=5中deal元素的总数),index=1的deal元素的倒计时计时器每setinterval循环4秒,因为setinterval(function(..),1000)每秒并行调用4次。index=2元素计时器的步长为3秒,依此类推
错在哪里 使用单个计时器,并在其回调中使用检查循环。你不需要每个项目都有一个计时器,因为“一秒就是一秒”,不管你测量了多少次:)谢谢你的回答,但我不知道我是否理解正确。每个交易元素的倒计时时间不同,因为每个交易都有自己的到期时间(每个报价的持续时间不同,一个可能持续20分钟,另一个可能持续3小时)。你能再解释一下你的建议吗?一个计时器给你一秒的时间。然后对每个项目倒计时,直到它们达到0。让时间运行并不是一个巨大的开销(比计时器都运行时的负载要好得多),但是当所有计数器都达到0时,可以将其关闭。如果您可以模拟代码的一个工作示例(例如JSFIDLE),我将实施我的建议。通过为每个deal元素分配一个唯一的类,问题已经得到解决(
total_number_of_deal_elements_in_the_DOM - index