更改一个变量后,jquery计时器在setInterval()中无法正常工作

时间:2018-07-30 09:15:19

标签: jquery

我创建了此计时器,该计时器在替换一个变量之前可以正常工作。

timer在3个不同的div上运行。我们的业务逻辑是,当有人在计时器结束之前出价时,计时器应动态更改,即“剩余时间+增量时间=新时间”。我将这个新时间存储在一个隐藏的值中,据我测试,它显示了完美的时间。起作用的计时器的代码是:

$(".diffinterval").each(function(){
        var total_lot = $(this).val();
        var count = $(this).closest(".heading").find("#lot_count").val();
        var seconds=parseInt($('#diff'+count).val());



        var countdownTimer = setInterval(function(){



            var days        = Math.floor(seconds/24/60/60);
            var hoursLeft   = Math.floor((seconds) - (days*86400));
            var hours       = Math.floor(hoursLeft/3600);
            var minutesLeft = Math.floor((hoursLeft) - (hours*3600));
            var minutes     = Math.floor(minutesLeft/60);
            var remainingSeconds = seconds % 60;
            if (remainingSeconds < 10) {
                remainingSeconds = "0" + remainingSeconds; 
            }
            $('#countdown'+count).html(": " + days + "d " + hours + "h " + minutes + "m " + remainingSeconds + "s");
            if (seconds == 0) {
                clearInterval(countdownTimer);
                alert('Bidding Time for the below Lots is Over.');
                location.reload();
            } else {
                newtime--;
            }
        },1000);

    });  

但是我试图检索该隐藏字段中的动态变化并相应地计算时间。计时器停止。这是我正在尝试的代码块

$(".diffinterval").each(function(){
        var total_lot = $(this).val();
        var count = $(this).closest(".heading").find("#lot_count").val();
        var seconds=parseInt($('#diff'+count).val());
        var secondElement=$('#diff'+count);



        var countdownTimer = setInterval(function(){

            var ext_time = parseInt(secondElement.val());
            var newtime;
            if(ext_time > seconds)
            {
                newtime=ext_time;
            }   
            else
            {
                newtime=seconds;
            } 

            var days        = Math.floor(newtime/24/60/60);
            var hoursLeft   = Math.floor((newtime) - (days*86400));
            var hours       = Math.floor(hoursLeft/3600);
            var minutesLeft = Math.floor((hoursLeft) - (hours*3600));
            var minutes     = Math.floor(minutesLeft/60);
            var remainingSeconds = newtime % 60;
            if (remainingSeconds < 10) {
                remainingSeconds = "0" + remainingSeconds; 
            }
            $('#countdown'+count).html(": " + days + "d " + hours + "h " + minutes + "m " + remainingSeconds + "s");
            if (newtime == 0) {
                clearInterval(countdownTimer);
                alert('Bidding Time for the below Lots is Over.');
                location.reload();
            } else {
                newtime--;
            }
        },1000);

    });  

如果我更改

var remainingSeconds = seconds % 60;

var remainingSeconds = newtime % 60;

计时器停止。

1 个答案:

答案 0 :(得分:0)

在摆弄您的return true;变量时,会在setInterval中每秒将其初始化为ext_time,因此它始终是HTML元素中设置的任何值。您必须从setInterval函数中取出变量初始化语句。您还必须在if / else语句的parseInt(secondElement.val())末尾减小该值(ext_time

编辑:根据您的特定用例,我更新了小提琴。我添加了一个标志来检查ext_time是否已启用,并且还显示一条消息,通知您setInterval现在替换了ext_time计时器。

还请注意,secondsseconds都选择了相同的元素值,但不确定是否要这样做,但是,如果您想要{{1} }您将需要为secondElement变量使用不同的起始值(即,具有不同value属性的其他隐藏输入元素)

请签出updated fiddle

我注意到您的小提琴与您在问题中发布的代码并不完全相同,但是问题出在变量初始化的位置。