1. 防抖:单位时间内,频繁触发事件,只执行最后一次
典型场景:搜索框搜索输入,只需用户最后一次输入完,再发送请求
手机号、邮箱验证输入检测。窗口大小`resize`。只需窗口调整完成后,计算窗口大小。防止重复渲染。
代码思路是:利用定时器,每次触发先清掉以前的定时器(从新开始)
2. 节流:单位时间内,频繁触发事件,只执行一次
典型场景:高频事件,快速点击、鼠标滑动、resize 事件、scroll 事件代码思路也是利用定时器,
代码思路是:等定时器执行完毕,才开启定时器(不要打断)
// 防抖
<input type="text">
<script>
function debounce(fn,delay){
let timer=null
// 返回一个函数,因为onkeyup=的值得为函数
return ()=>{
if(timer){
clearTimeout(timer) // 清除定时器
}
timer=setTimeout(()=>{
fn()
},delay)
}
}
let ipt=document.querySelector('input')
ipt.onkeyup=debounce(()=>console.log(ipt.value),1000)
</script>
// 节流
<input type="text">
<script>
const input = document.querySelector('input');
function throttle(fn,delay){
let timer=null
return ()=>{
if(timer){
return
}
timer=setTimeout(()=>{
fn()
timer=null
// clearTimeout(timer) 写不写一样
},delay)
}
}
input.onkeyup = throttle(() => {
console.log(input.value);
}, 500)
</script>