首页 > JavaScript >  JavaScript 如何延迟 .keyup() 处理器直到用户停止键入?

 JavaScript 如何延迟 .keyup() 处理器直到用户停止键入?

上一篇 下一篇

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

我想有一个延迟,所以它只在用户停止键入 200 毫秒时进行搜索。

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

我该怎么做?

分割线

网友回答:

我将这个小函数用于相同的目的,在用户停止键入指定时间后或在以高速率触发的事件中执行函数,例如:resize

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));
<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 的事件对象,DOM 元素为 )。this

更新 2019-05-16

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

function delay(fn, ms) {
  let timer = 0
  return function(...args) {
    clearTimeout(timer)
    timer = setTimeout(fn.bind(this, ...args), ms || 0)
  }
}

该实现包含一组测试。

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

分割线

网友回答:

如果要在类型完成后进行搜索,请使用全局变量来保存从调用返回的超时,如果尚未发生,则使用“取消超时”,以便它不会触发超时,除非在最后一个事件上setTimoutclearTimeoutkeyup

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);  
}   

分割线

网友回答:

CMS的答案又略有增强。要轻松允许单独的延迟,您可以使用以下内容:

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

如果您想重用相同的延迟,只需执行

var delay = makeDelay(250);
$(selector1).on('keyup', function() {delay(someCallback);});
$(selector2).on('keyup', function() {delay(someCallback);});

如果你想要单独的延迟,你可以做

$(selector1).on('keyup', function() {makeDelay(250)(someCallback);});
$(selector2).on('keyup', function() {makeDelay(250)(someCallback);});

模板简介:该模板名称为【 JavaScript 如何延迟 .keyup() 处理器直到用户停止键入?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【JavaScript】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 209次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 04-20
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信公众平台 单页式简历模板 微信文章 微信模板 响应式 企业网站 微信素材 微信图片 自适应 html5
您可能会喜欢的其他模板