Javascript JS setInterval()函数无法正确启动

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

我是JS新手,正在调试一段我没有编写的代码。 我正在做一个项目,我们需要处理一些基于交易的报价。DOM中的每个deal元素都有一个个人到期时间,我们使用倒计时来跟踪该时间。 以下是包含计时器的html页面(Django模板):

<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