0

我正在使用 jQuery(最新版本)并有一个名为“calculate()”的函数,每次编辑字段和退出字段(模糊等)时都会调用该函数。(允许“动态”计算”)计算需要不到 4 秒的时间来完成,但是如果用户在计算完成之前更改了表单上的另一个元素,那么它们会被排队,并且在当前操作完成后再次调用该函数.由于我无法停止该功能一旦启动就停止处理,是否可以将功能延迟几秒钟,然后每次与表单元素交互时,添加到计时器。

我不认为这是可能的,但我想试一试。

我知道我可以做到: setTimeout(function(){ ... }, 4000); 但我需要一种方法来添加到这个计时器。(即计时器还剩 1 秒,我点击一个字段,我希望计时器回到 4 秒)

4

5 回答 5

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);
于 2012-06-20T15:40:47.980 回答
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 秒。当您更改计算功能并且需要更长的时间时会发生什么?

希望这可以帮助。

于 2012-06-20T15:41:34.863 回答
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);
于 2012-06-20T15:46:43.663 回答
0

您可以记住 timeoutID 并在每次启动新计时器时重置旧计时器。

var timeoutID = null;
if ( timeoutID !== null ) {
  window.clearTimeout( timeoutID );
}
timeoutID  = window.setTimeout( function(){
  // your code here
}, 4000 );
于 2012-06-20T15:40:56.317 回答
0

正如其他人所提到的,clearTimeout是处理这个问题的方法。我整理了一个非常基本的例子来说明它是如何工作的。单击按钮将在函数运行之前取消并重新启动计时器,但此事件可以很容易地绑定到另一个事件(例如字段上的焦点或模糊,就像您正在做的那样)

此处使用 clearTimeout 延迟执行的示例 >>

于 2012-06-20T18:04:06.733 回答