我有一个页面,我希望用户可以使用“年龄计数器”进行投标。用户数量因情况而异,因此需要加以考虑。我写了这个:
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
答案 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);
}
});