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失敗,彈出“操作失敗”。萬一多次彈窗,那就是一個災難了