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" 稍后要执行的脚本。
你必须交换参数。
是 $.debounce(delay, callback)
而不是 $.debounce(callback, delay)
去抖一个函数的执行。与节流不同,去抖动保证函数只执行一次,无论是在一系列调用的最开始还是最后。如果您想简单地限制函数的执行速度,请参阅 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_begin
是 true
,callback
将仅在第一次去抖函数调用时执行。 (在 delay
毫秒内未调用节流函数后,内部计数器将重置)
callback (Function)
在延迟毫秒后执行的函数。 this
上下文和所有参数在执行 debounced 函数时按原样传递给 callback
。
我正在使用 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" 稍后要执行的脚本。
你必须交换参数。
是 $.debounce(delay, callback)
而不是 $.debounce(callback, delay)
去抖一个函数的执行。与节流不同,去抖动保证函数只执行一次,无论是在一系列调用的最开始还是最后。如果您想简单地限制函数的执行速度,请参阅 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_begin
是 true
,callback
将仅在第一次去抖函数调用时执行。 (在 delay
毫秒内未调用节流函数后,内部计数器将重置)
callback (Function)
在延迟毫秒后执行的函数。 this
上下文和所有参数在执行 debounced 函数时按原样传递给 callback
。