function throttle(func, wait, mustRun) {
var timeout,//timeout 可以放在外面,这样可以多个时间绑定同个函数。
var startTime = new Date();
return function() {
var context = this,
args = arguments,
curTime = new Date();
clearTimeout(timeout);
// 如果达到了规定的触发时间间隔,触发 handler
if(mustRun && (curTime - startTime >= mustRun)){
func.apply(context,args);
startTime = curTime;
// 没达到触发间隔,重新设定定时器
}else{
timeout = setTimeout(function(){
func.apply(context,args);
}, wait);
}
};
};
// 实际想绑定在 scroll 事件上的 handler
function realFunc(){
console.log("Success");
}
// 采用了节流函数
window.addEventListener('scroll',throttle(realFunc,500,1000));
现在来谈一下 keyup.
我们知道 keydown ,是按下去触发,up是键盘弹上来触发的。
一般我建议是用keyup的。
使用keyup的目的就是在输入完毕的时候处理一些事情。比如这个例子。
$("input").keyup(function(){
if(this.value.length === 6){
doSomething();
}
});
上面这个例子,没有使用节流函数,
并且使用了判断条件,避免每次keyup都执行方法。
咋一看还挺完美的。
实际使用情况中,如果 你按住某个键,知道长度等与6,会一下子触发多个执行函数,因为它们检测到 长度都是6。这可不是我们想要的。
而且,如果有多个event都绑定 这个函数的话,也会造成多次执行。
普通的执行操作还行,如果doSomething涉及到 异步操作,访问接口等 。没有节流函数将会造成极大的影响。比如ajax失败,弹出“操作失败”。万一多次弹窗,那就是一个灾难了