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

在函数创建的对象中更新Javascript变量setInterval,javascript,jquery,forms,object,timing,Javascript,Jquery,Forms,Object,Timing,我试图在javascript中创建一个停止和启动计时器函数,用于jQuery中记录$'input'的.focus和.blur之间的时间 这就是我到目前为止所做的: function startTimer() { _id = guid() time = 0 timer_id = setInterval(function () { time++; }, 100); timer = { _id: _id, ti

我试图在javascript中创建一个停止和启动计时器函数,用于jQuery中记录$'input'的.focus和.blur之间的时间

这就是我到目前为止所做的:

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

});
小提琴:


问题是startTimer创建的timer对象上的时间没有更新,您只是增加了timer变量,而不是time对象。只需将您的值更改为下面的值

timer_id = setInterval(function () {
    timer.time = time++; 
}, 100);
当你说:

timer = {
    _id: _id,
    time: time,
    timer_id: timer_id,
}
正在计算右侧的所有值。因此,timer.time被设置为时间在该时间点的整数值。它未设置为对时间变量的引用

一种修复方法是简单地引用间隔中的timer.time:

timer_id = setInterval(function () {
    timer.time++;
}, 100);
编辑: 此外,您还需要解除正在附加的.blur事件的绑定:

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

谢谢,问题出在timer上。time++让它按我预期的方式工作,但是我的jquery看起来很好,我不确定blur.timer指的是什么to@AndrewBlaneyblur.timer的.timer部分只是一个。我添加它是为了不删除对象上的任何其他模糊事件,只删除带有名称空间计时器的模糊事件。@AndrewBlaney-注意变量名/声明。在startTimer和local timer中使用全局时间和计时器,在focus和blur处理程序中使用时间。@AndrewBlaney-每次执行其focus处理程序时,都会向输入添加一个新的blur处理程序。