在jQuery中调用事件调用

Pet*_*son 41 javascript jquery events

我有一个keyup事件绑定到一个需要大约四分之一秒才能完成的函数.

$("#search").keyup(function() {
  //code that takes a little bit to complete
});
Run Code Online (Sandbox Code Playgroud)

当用户键入整个单词或快速按下键时,该功能将连续多次调用,并且需要一段时间才能完成.

有没有办法限制事件调用,以便如果有几个快速连续,它只触发最近调用的那个?

jos*_*736 59

看看jQuery Debounce.

$('#search').keyup($.debounce(function() {
    // Will only execute 300ms after the last keypress.
}, 300));
Run Code Online (Sandbox Code Playgroud)

  • 这不回答这个问题.OP可能认为它已被回答,但这甚至不是所描述的内容的一半,并且绝不接近自动完成结果的预期行为.去抖是错误的功能.OP实际上是要求油门.请参阅:https://css-tricks.com/the-difference-between-throttling-and-debouncing/ (5认同)
  • @HungryCoder:[确实有用.](http://jsfiddle.net/josh3736/Xnnmf/)当然,每个匹配的元素都会共享相同的计时器,因此在完全停止发送事件之后才会触发回调. (2认同)
  • Debounce 不是节流......它是别的东西 (2认同)

Nat*_*sos 8

这是一个不需要插件的潜在解决方案.使用布尔值来决定是否执行keyup回调,或跳过它.

var doingKeyup = false;

$('input').keyup(function(){
    if(!doingKeyup){
        doingKeyup=true;
        // slow process happens here
        doingKeyup=false;
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 这是油门,而不是去抖动.在搜索字段的情况下,您希望在用户完成键入(去抖动)之后运行搜索*,而不是在他们键入一个字符(节流)之后.Debounce插件实际上只是一个<1 kB的便捷方法,它包含了对`setTimeout` /`clearTimeout`的调用. (2认同)
  • 仅当 `// 慢进程` 发生在另一个事件循环中时,这才是正确的方式,否则因为 JS 是单线程的,这没有用。 (2认同)

Mic*_*per 5

你也可以使用优秀的Underscore/_库。

Josh 的回答中的评论,目前最流行的,争论您是否真的应该限制通话,或者是否需要一个 debouncer。区别有点微妙,但 Underscore 同时具有:_.debounce(function, wait, [immediate])_.throttle(function, wait, [options]).

如果您还没有使用 Underscore,请检查一下。它可以让你的 JavaScript 更简洁,并且足够轻量级,让大多数库讨厌者停下来。