首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何延迟.keyup()处理程序,直到用户停止键入?

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

Stack Overflow用户
提问于 2009-12-16 02:33:27
回答 28查看 310.6K关注 0票数 716

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

我希望有一个延迟,所以它只在用户停止键入200ms时才进行搜索。

keyup函数中没有此选项,我尝试过setTimeout,但它不起作用。

我该怎么做呢?

EN

回答 28

Stack Overflow用户

回答已采纳

发布于 2009-12-16 02:45:40

我使用这个小函数来实现同样的目的,在用户停止输入指定的时间后或者在以高速率触发的事件中执行一个函数,比如resize

代码语言:javascript
运行
复制
function delay(callback, ms) {
  var timer = 0;
  return function() {
    var context = this, args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function () {
      callback.apply(context, args);
    }, ms || 0);
  };
}


// Example usage:

$('#input').keyup(delay(function (e) {
  console.log('Time elapsed!', this.value);
}, 500));
代码语言:javascript
运行
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label for="input">Try it:
<input id="input" type="text" placeholder="Type something here..."/>
</label>

它的工作原理:

delay函数将返回一个内部处理单个计时器的包装函数,在每次执行中,计时器都会以提供的时间延迟重新启动,如果在此时间过去之前发生了多次执行,则计时器将重新设置并重新启动。

当计时器最终结束时,将执行回调函数,传递原始上下文和参数(在本例中,传递的是jQuery的事件对象和this形式的DOM元素)。

更新2019-05-16

我已经在现代环境中使用ES5和ES6特性重新实现了该功能:

代码语言:javascript
运行
复制
function delay(fn, ms) {
  let timer = 0
  return function(...args) {
    clearTimeout(timer)
    timer = setTimeout(fn.bind(this, ...args), ms || 0)
  }
}

set of tests中介绍了该实现。

有关更复杂的内容,请查看jQuery Typewatch插件。

票数 1.3K
EN

Stack Overflow用户

发布于 2009-12-16 02:43:17

如果要在输入完成后进行搜索,请使用全局变量来保存从setTimout调用返回的超时,如果还没有发生,则使用clearTimeout取消超时,这样除了最后一个keyup事件外,它不会触发超时

代码语言:javascript
运行
复制
var globalTimeout = null;  
$('#id').keyup(function(){
  if(globalTimeout != null) clearTimeout(globalTimeout);  
  globalTimeout =setTimeout(SearchFunc,200);  
}   
function SearchFunc(){  
  globalTimeout = null;  
  //ajax code
}

或者使用匿名函数:

代码语言:javascript
运行
复制
var globalTimeout = null;  
$('#id').keyup(function() {
  if (globalTimeout != null) {
    clearTimeout(globalTimeout);
  }
  globalTimeout = setTimeout(function() {
    globalTimeout = null;  

    //ajax code

  }, 200);  
}   
票数 67
EN

Stack Overflow用户

发布于 2013-10-09 06:27:34

这是对CMS答案的另一个小小的改进。要轻松实现单独的延迟,您可以使用以下方法:

代码语言:javascript
运行
复制
function makeDelay(ms) {
    var timer = 0;
    return function(callback){
        clearTimeout (timer);
        timer = setTimeout(callback, ms);
    };
};

如果您想重用相同的延迟,只需这样做

代码语言:javascript
运行
复制
var delay = makeDelay(250);
$(selector1).on('keyup', function() {delay(someCallback);});
$(selector2).on('keyup', function() {delay(someCallback);});

如果您想要单独的延迟,可以这样做

代码语言:javascript
运行
复制
$(selector1).on('keyup', function() {makeDelay(250)(someCallback);});
$(selector2).on('keyup', function() {makeDelay(250)(someCallback);});
票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1909441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档