其实Extjs的Function对象里有大量的函数,比如createBuffered,createThrottled等高级函数,帮助你解决一下函数问题。但是createBuffered比较奇怪,第一次执行有一定的时间差,这对于事件注册来说,不能接受。而看过createBuffered代码后,发现无法解决,因为里面使用的是setTimeout。
createBuffered的执行顺序
----buffer----fn----buffer----fn----
debounce的执行顺序
fn----buffer----fn----buffer----
// 类似debounce,但是有默认延迟,修改一下
Ext.Function.debounce=function(fn, buffer, scope, args) {
var beforeTime=0;
return function() {
var callArgs = args || Array.prototype.slice.call(arguments, 0),
me = scope || this;
// 不是第一次执行
if (beforeTime) {
var now=(new Date()).getTime();
if(now-beforeTime>buffer){
fn.apply(me, callArgs);
console.log('larger than now');
beforeTime=now;
}
}else{
fn.apply(me, callArgs);
console.log('first');
beforeTime=(new Date()).getTime();
}
};
};
使用:在controller中使用
onClick: Ext.Function.debounce(function(){
alert('click');
},500)