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)idssetIntervalsetIntervalisetInterval

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

Fiddle に変更を加えました

于 2013-04-25T15:35:59.067 に答える