多个年龄计数器(计时器)的麻烦

时间:2013-04-25 14:02:25

标签: javascript jquery

我有一个页面,我希望用户可以使用“年龄计数器”进行投标。用户数量因情况而异,因此需要加以考虑。我写了这个:

function timer(i) {
          // this selects a 'hh:mm:ss' timestamp
        if ($("#time_0" + i).text() !== "") {
            var now = new Date();
            var date = now.toDateString();
            var tStamp = new Date(date + "," + $("#time_0" + i).text());
            var diff = now - tStamp;
            var mins = Math.floor(diff / (1000 * 60));
            var secs = Math.floor((diff / 1000) % 60);
            if (mins < 10) {
                mins = "0" + mins;
            }
            if (secs < 10) {
                secs = "0" + secs;
            } else if (secs == 60) {
                secs = "00";
            }
            $("#user" + i + "-t").text(mins + ':' + secs);
        }
}

$(document).ready(function() {
                    //
            var ids = [];
            $("td[id^='time_0']").each(function() {
                var i = ($(this).attr("id")).slice(-1);
                ids.push(i);
            });
            for (i in ids) {  // in my example ids = [1,2,3]
                setInterval(function() {timer(i);}, 1000);
            }
});

计时器本身就像我想要的那样运行,但仅适用于用户#2(中间用户)。我认为如果我遇到这个问题,它将是列表中第一个或最后一个有工作计时器的用户,但是我为用户#1和#3获取了空白单元格。

有没有人对如何解决这个问题有任何想法?谢谢你的时间。

==编辑==

我做了一个简单的jsfiddle

1 个答案:

答案 0 :(得分:1)

在您的版本循环中,从未超过第一个引用,即timer(0),因为您使用timer(i)调用了函数,该函数调用了数组ids中的第一个键。如果循环中有setInterval,它将保持循环第一个setInterval,直到它终止。通过将i置于匿名函数中,每个setInterval都会被触发。

$(document).ready(function () {
    var ids = [];
    $("td[id^='time_0']").each(function () {
        var i = $(this).attr("id").slice(-1);
        ids.push(i);
    });

    for (i in ids) {
        (function(i) { // i needs to be stored into a anonymous function otherwise it gets overwritten
            setInterval(function() {
                timer(ids[i]); // calling just timer(i) would use array keys, not the actual values - ids[i] means: "give me the value of the key of i"
            }, 1000)
        })(i);
    }
});

Made changes to your Fiddle