2011-03-07 50 views
1

作为后续行动这个question的,我想知道这是为什么不工作clearTimeout和setTimeout的工作不

$("#textarea").keydown(function(){ 
oldValue = $("#textarea").val(); 
}); 
$("#textarea").keyup(function(){ 
var startTimer = null; 
if(startTimer) clearTimeout(startTimer); 
startTimer = setTimeout(function(){ 
var newValue = $("#textarea").val(); 
// get something out of the comparison 
alert(something) // alert the comparison 
    oldValue = newValue; 

},2000); 

所需的行为将只能得到一个提示信息时,用户不是招” t键入任何东西2秒钟。它适用于比较部分,但是,当我继续打字时,它不会停止警报消息。相反,我得到的警报数量与按下的按键数量相同。 我试过这个创建和删除cookies的版本,它工作正常。这种特殊情况有什么不对?

+0

var startTimer = null; if(startTimer)clearTimeout(startTimer); //条件永远不会是真的... – JAAulde 2011-03-07 18:02:58

+0

@JAAulde:当然,你是对的。谢谢:-) – 2011-03-07 19:06:29

回答

5

您每次调用keyup处理程序时都会得到一个新的startTimer(并将其初始化为null)。尝试在外部范围声明它:

(function() { 
    var startTimer = null; 
    var oldValue; // Declare this too, so it isn't global 

    $("#textarea").keydown(function(){ 
     oldValue = $("#textarea").val(); 
    }); 
    $("#textarea").keyup(function(){ 
     if(startTimer) { 
      clearTimeout(startTimer); 
     } 
     startTimer = setTimeout(function(){ 
      var newValue = $("#textarea").val(); 
      // get something out of the comparison 
      alert(something) // alert the comparison 
      oldValue = newValue; 
     },2000); 
    }); 
})(); 
+0

当然。解决了这个问题。它不会产生我想要的行为,但绝对可以解决此问题。谢谢! – 2011-03-07 19:05:53

1

我想你真正想要的是看看使用节流还是反弹样式函数。这里有一个小写,写了一个与一起使用或没有使用jQuery的,并且可以完全按照您的要求进行操作。我会试试看。

http://benalman.com/projects/jquery-throttle-debounce-plugin/

节流 使用jQuery油门/防抖动,可以通过延迟和功能$ .throttle得到一个新功能,即重复调用的时候,执行原有功能(在相同的情况下并通过所有参数)每延迟毫秒不超过一次。

节流对于调整大小和滚动等事件处理程序的速率限制执行特别有用。只需看看下面的使用示例或工作节流示例,即可亲眼看到!

还可以看到他使用的美妙的工作流程图像。我不会热链接,但值得一读这篇文章,看看什么库已经存在,这样你可以节省一些时间。

+0

1+。那看起来很有希望我一定会看看这个。但是,我想知道为什么我没有在我的代码中获得预期的行为。 – 2011-03-07 18:02:22

+1

@Robert〜你非常欢迎。我知道有人(在这种情况下,马修)会一起调试你正面临的实际问题,但我偶然发现了我在另一个问题上提供了几个星期的链接,并且认为我会在帮助中付出代价。我都是使用框架独立的JavaScript来帮助我,所以我不必重写任何东西,你知道吗? – jcolebrand 2011-03-07 21:38:17

+0

我同意。此外,让我告诉你,通过在keydown函数中使用$ .debounce,你的建议实际上做了我想要的(以及Matthew修正)。谢谢!。 – 2011-03-08 01:48:56