将前导零添加到Javascript计时器

时间:2012-01-29 16:05:11

标签: javascript timer countdown

我试图将前导零添加到秒值,并且我一直遇到错误。我已尝试在此处发布了一些选定的解决方案,似乎无法使其正常运行。

我从跨度中提取值,因为这些值来自数据库。

var timer = $('.timer');

$('.prev-button,.next-button').hide();

setInterval(function () {

    var m = $('.min', timer),
        s = $('.sec', timer);

    if (m.length == 0 && parseInt(s.html()) <= 0) {
        timer.html('Proceed to the Next Slide');
        $('.prev-button,.next-button').fadeIn();
    }

    if (parseInt(s.html()) <= 0) {
        m.html(parseInt(m.html() - 1));
        s.html(60);
    }

    if (parseInt(s.html()) < 10) {

        $('.sec').prepend(0)

    }


    if (parseInt(m.html()) <= 0) {

        timer.html('Time remaining for this slide - <span class="sec">59</span> seconds')

    }

    s.html(parseInt(s.html() -1));

}, 1000);

http://jsfiddle.net/certainstrings/a2uJ2/1/

4 个答案:

答案 0 :(得分:1)

我修改了你的小提琴以使其有效。 http://jsfiddle.net/a2uJ2/3/

您应该将时间存储在javascript int vars中,而不是每次都从html元素中读取它。当您将逻辑附加到html文档的布局时,这会导致可维护性问题。

我没有修复所有代码,但我创建了两个用于执行计算的变量。

答案 1 :(得分:1)

一些事情:你最好注册一个开始时间,然后在区间函数中进行比较。定时器不能保证精确,但会在指定的时间间隔后触发。如果电脑忙,计时器可能会迟到。

此外,如果您正在使用parseInt,则始终总是指定基数参数(数字基数)。如果不这样做,字符串“08”将被解析为“0”,因为前导零被解释为八进制(base-8)。因此,使用parseInt(string, 10)来解析普通的10号基数。

至于添加前导零,我会说你应该保留几个变量的总时间,而不是一直读/写元素。

Updated you jsfiddle

var duration, startTime, interval;

duration = parseInt($(".min").text(), 10) * 60 + parseInt($(".sec").text(), 10);
startTime = (new Date()).getTime();

function countDown() {
    var elapsed, remaining, m, s;
    elapsed = ((new Date()).getTime() - startTime) / 1000;
    remaining = duration - elapsed;

    if(remaining <= 0) {
        clearInterval(interval);
        $(".timer").text('Proceed to the Next Slide');
        $('.prev-button,.next-button').fadeIn();
    } else {
        m = String(Math.round(remaining / 60));
        s = String(Math.round(remaining % 60));
        if( s < 10 ) {
            s = "0" + s;
        }
        $(".min").text(m);
        $(".sec").text(s);
    }
}

interval = setInterval(countDown, 500);

这只是您代码的最小变化。我可能会做一些根本不同的事情,以保持标记和JS尽可能分开,依此类推,但这也有效。

答案 2 :(得分:0)

尝试这样:

if (parseInt(s.html()) < 10) {

        $('.sec').val('0' + $('.sec').val());

    }

答案 3 :(得分:0)

您需要将该值视为string,而不是int。 JavaScript非常积极地将看起来像数字的东西转换成数字,这就是这里发生的事情。