更新由函数创建的对象中的 Javascript 变量 setInterval

Update Javascript variable setInterval in an object created by function with

我正在尝试在 javascript 中创建一个停止和启动计时器函数,以便在 jQuery 中使用以记录 $('input').

这是我目前拥有的:

function startTimer() {

    _id = guid()
    time = 0
    timer_id = setInterval(function () {
        time++;
    }, 100);

    timer = {
        _id: _id,
        time: time,
        timer_id: timer_id,
    }

    return timer;
}

function stopTimer(timer) {
    var stop = timer.time
    clearInterval(timer.timer_id);
    return stop;
}

// usage
fieldTimes = {}


// on focus of field
$("input").on('focus', function (e) {

    element = e.target;
    var timer = startTimer();

    // on unfocus of field
    $(element).blur(function () {
        var time = stopTimer(timer);
        var field = e.target.id
        if (fieldTimes.hasOwnProperty(field)) {
            fieldTimes[field] += time;
        } else {
            fieldTimes[field] = time;
        }
    })

});

Fiddle: http://jsfiddle.net/andrewblaney/Ltfvmaec/

问题是在 startTimer

创建的计时器对象上没有更新时间

你只是在增加定时器变量而不是时间object.Just把你的改成下面的

timer_id = setInterval(function () {
    timer.time = time++; 
}, 100);

当你说:

timer = {
    _id: _id,
    time: time,
    timer_id: timer_id,
}

正在评估右侧的所有值。因此,timer.time 被设置为 time 在那个时间点的整数值。它 设置为对 time 变量的引用。

一个修复方法是简单地在区间中引用 timer.time

timer_id = setInterval(function () {
    timer.time++;
}, 100);

编辑: 此外,您需要取消绑定您附加的 .blur 事件:

$(element).on("blur.timer", function () {
    // ... code here ...
    $(element).off("blur.timer");
})

Updated Fiddle