如何延迟.keyup()处理程序,直到用户停止键入?

我有一个搜索栏。 现在它搜索每个键盘。 因此,如果有人输入“Windows”,它将使用AJAX搜索每个关键字:“W”,“Wi”,“Win”,“Wind”,“Windo”,“Window”,“Windows”。

我想要延迟,所以它只会在用户停止输入200毫秒时进行搜索。

keyup函数中没有这个选项,我尝试了setTimeout ,但它没有工作。

我怎样才能做到这一点?


我使用这个函数来达到同样的目的,在用户停止输入指定的时间后执行一个函数:

var delay = (function(){
  var timer = 0;
  return function(callback, ms){
    clearTimeout (timer);
    timer = setTimeout(callback, ms);
  };
})();

用法:

$('input').keyup(function() {
    delay(function(){
      alert('Time elapsed!');
    }, 1000 );
});

对于更复杂的东西,请查看jQuery Typewatch插件。


如果要在类型完成后搜索,请使用全局变量来保存从setTimout调用返回的超时值,并使用clearTimeout将其取消(如果尚未发生),以便除最后一次keyup外不会触发超时事件

var globalTimeout = null;  
$('#id').keyup(function(){
  if(globalTimeout != null) clearTimeout(globalTimeout);  
  globalTimeout =setTimeout(SearchFunc,200);  
}   
function SearchFunc(){  
  globalTimeout = null;  
  //ajax code
}

或者使用匿名功能:

var globalTimeout = null;  
$('#id').keyup(function() {
  if (globalTimeout != null) {
    clearTimeout(globalTimeout);
  }
  globalTimeout = setTimeout(function() {
    globalTimeout = null;  

    //ajax code

  }, 200);  
}   

您也可以查看underscore.js,它提供了像debounce这样的实用方法:

var lazyLayout = _.debounce(calculateLayout, 300);
$(window).resize(lazyLayout);
链接地址: http://www.djcxy.com/p/46173.html

上一篇: How to delay the .keyup() handler until the user stops typing?

下一篇: Jquery JQGrid breaks when contentType=application/json?