jQuery Throttle - Debounce | callback.apply不是一个函数

时间:2015-12-09 15:17:52

标签: jquery twitter-bootstrap caroufredsel uncaught-typeerror throttling

我正在使用Ben Alman的jQuery限制 - debounce脚本,并且在触发时我继续遇到未捕获的TypeError。

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

我得到的错误是这样的: 未捕获的TypeError: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 );
      }
    };

我对这个剧本并不熟悉,因为它在我被要求接管之前就已经存在了。当用户点击搜索字段以切换稍后要实施的“自动完成”脚本时,将触发限制脚本。

JFIDDLE

1 个答案:

答案 0 :(得分:2)

你必须交换参数 它是$.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或未指定,则回调将仅在最后一次去抖动函数调用后delay毫秒执行。如果at_begintruecallback将仅在第一次去抖动函数调用时执行。 (在delay毫秒之后没有调用限制函数后,内部计数器被重置)

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