我正在使用jQuery(最新版本),并且有一个名为“calculate()”的函数,每次编辑一个字段并退出字段(模糊等)时都会调用它。 (允许“动态”计算“) 计算完成时间不到4秒,但如果用户在计算完成之前更改了表单上的另一个元素,则它们将排队,并在当前操作完成后再次调用该函数。 由于我无法在启动时停止处理该函数,是否可以将函数延迟几秒钟,然后每次与表单元素进行交互时,都会添加到计时器中。
我不认为这是可能的,但是我会试一试。
我知道我能做到:
setTimeout(function(){ ... }, 4000);
但我需要一种方法来添加到这个计时器。 (即计时器还剩1秒,我点击一个字段,我希望计时器回到4秒)
答案 0 :(得分:1)
这可以通过在执行clearTimeout()
之前调用setTimeout()
来清除任何待处理的操作来处理。
// Declare the variable that holds the timeout pointer at a higher scope
var ts;
// in your onblur
// clear any pending pointer
if (ts) window.clearTimeout(ts);
// then reset the timeout and assign its handle to the same variable ts
ts = window.setTimeout(function() {}, 4000);
答案 1 :(得分:1)
我会做的是这样的事情:
var isCalculating = false;
var calculateQueue = false;
function calculate(){
isCalculating = true;
// do calculations
isCalculating = false;
if(calculateQueue){
calculate();
}
}
$('element').blur(function(){
if(!isCalculating){
calculate();
}
else{
calculateQueue = true;
}
});
这样您就不会运行并发calculate()
函数。不需要无限的计时器,如果有计算“排队”,那么它们将在第一个计算功能停止后计算...而不是每次等待4次。更改计算功能会发生什么情况需要更长时间?
希望这有帮助。
答案 2 :(得分:1)
您的问题不是添加到计时器,而是清除以前的计时器。
你可以这样做:
var delay = (function() {
var time_id;
return function(callback, ms) {
if (time_id) {
window.clearTimeout(time_id);
}
time_id = window.setTimeout(callback, ms);
};
}());
// use it like
delay(function(){...}, 4000);
答案 3 :(得分:0)
您可以记住timeoutID并在每次开始新计时时重置旧计时器。
var timeoutID = null;
if ( timeoutID !== null ) {
window.clearTimeout( timeoutID );
}
timeoutID = window.setTimeout( function(){
// your code here
}, 4000 );
答案 4 :(得分:0)
正如其他人所说,clearTimeout
是解决这个问题的方法。我总结了一个如何运作的基本例子。单击该按钮将取消并在函数运行之前重新启动计时器,但此事件很容易绑定到另一个事件(如字段上的焦点或模糊,就像您将要执行的那样)