1

我有一个页面,我想在其中为用户提出的出价提供“年龄计数器”。用户数量会因情况而异,因此需要考虑到这一点。我写了这个:

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

4

1 回答 1

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);
    }
});

对您的小提琴进行了更改

于 2013-04-25T15:35:59.067 回答