jQuery 油门 - 去抖 | callback.apply 不是函数

jQuery Throttle - Debounce | callback.apply is not a function

我正在使用 Ben Alman 的 jQuery throttle - debounce 脚本,当它被触发时我继续 运行 进入未捕获的 TypeError。

还应该说,我正在使用 Twitter Bootstrap 作为响应式设计的框架,并且在页面上也有一些同步的 CarouFredSels。

我得到的错误是: 未捕获的类型错误:callback.apply 不是函数 jquery.ba-throttle-debounce.js:149

我查看第 149 行,这是感兴趣的区域:

function wrapper() {
      var that = this,
        elapsed = +new Date() - last_exec,
        args = arguments;

      function exec() {
        last_exec = +new Date();
        callback.apply( that, args ); //LINE 149//
      };

      function clear() {
        timeout_id = undefined;
      };

      if ( debounce_mode && !timeout_id ) {
        exec();
      }

      timeout_id && clearTimeout( timeout_id );

      if ( debounce_mode === undefined && elapsed > delay ) {
        exec();

      } else if ( no_trailing !== true ) {
        timeout_id = setTimeout( debounce_mode ? clear : exec, debounce_mode === undefined ? delay - elapsed : delay );
      }
    };

我不是很熟悉这个脚本,因为它在我被要求接手之前就已经存在了。当用户点击一个搜索字段时,会触发节流脚本,该搜索字段会切换 "auto-complete" 稍后要执行的脚本。

JFIDDLE

你必须交换参数。
$.debounce(delay, callback) 而不是 $.debounce(callback, delay)


jQuery.debounce

去抖一个函数的执行。与节流不同,去抖动保证函数只执行一次,无论是在一系列调用的最开始还是最后。如果您想简单地限制函数的执行速度,请参阅 jQuery.throttle 方法。

用法

var debounced = jQuery.debounce( delay, [ at_begin, ] callback );

jQuery('selector').bind( 'someevent', debounced );
jQuery('selector').unbind( 'someevent', debounced );

参数

delay (Number)
以毫秒为单位的零延迟或更大延迟。对于事件回调,100 或 250(甚至更高)左右的值最有用。

at_begin (Boolean)
可选,默认为 false。如果 at_begin 为 false 或未指定,回调只会在最后一次 debounced-function 调用后 delay 毫秒执行。如果 at_begintruecallback 将仅在第一次去抖函数调用时执行。 (在 delay 毫秒内未调用节流函数后,内部计数器将重置)

callback (Function)
在延迟毫秒后执行的函数。 this 上下文和所有参数在执行 debounced 函数时按原样传递给 callback