在函数创建的对象中更新Javascript变量setInterval
我试图在javascript中创建一个停止和启动计时器函数,用于jQuery中记录$'input'的.focus和.blur之间的时间 这就是我到目前为止所做的:在函数创建的对象中更新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
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处理程序。