防抖和节流的学习笔记,以及利用防抖模拟双击事件
防抖
基于性能考虑,不可能不停的去获取信息,而是应该等用户停止操作超过一段时间之后,再获取
防抖思路
每次触发事件时都清除之前挂起的定时器,然后重新计算延时
function debounce( fn , delay){
let handle;
//清除之前的延时
clearTimeout(handle);
handle = setTimeout(()=>{
fn(e);
},delay)
}
fn 是执行的函数 delay 是要延时的时间
节流
它和防抖差不多,不过比防抖要宽松一些,相当于是设置一段固定的时间在这个时间过去之后,就执行一次
节流思路
每次触发事件时都判断当前是否有等待执行的延时函数
方法1: f
unction throttle( fn , delay ){
let runFlag = false;
return function (e){
// 判断之前的调用是否完成
if (runFlage){
return false;
}
runFlag = true;
setTimeout(()=>{
fn(e);
runFlag = false;
},delay)
}
}
方法2: (时间戳) function timePoint( fn ){ var date = new Date(); // 上一次触发的时间戳 document.body.addEventListener('scroll',function(){ var now = new Date(); //当前的时间戳 if( now - date > 500 ){ //时间戳差小于一定值就触发 fn(); date = now; //并且更新时间戳 } }) }