函数防抖(debounce)
某个函数执行后开始计时,到指定时间之后才开始执行想要执行的函数
通俗点讲,就是通过SetTimeout设置毫秒时间,在触发事件后,n秒内没有再次触发事件,处理函数才会执行,如果在这一段时间来到之前,又一次触发了事件,那就重新计时。
- 例子
例子中是利用了echart图标插件来展示的一个统计图,在浏览器窗口改变大小时,我们需要实时的改变图表的大小,使得图表始终居中完整的平铺在浏览器中。
- 监听浏览器的resize
window.addEventListener('resize',debounce (pageResize, 200));
- 改变图表的大小
function pageResize() {
MyChart.resize();
}
- 函数防抖(利用setTimeout()特性实现延时触发,通过delay来控制延时时间)
function debounce (fn, delay) {
let handle;
return function (e) {
// 取消之前的延时调用
clearTimeout(handle);
handle = setTimeout(() => {
fn();
}, delay);
}
}
连续的事件,只需触发一次回调的场景有:
- 搜索框搜索输入。只需用户最后一次输入完,再发送请求
- 手机号、邮箱验证输入检测
- 窗口大小Resize。只需窗口调整完成后,计算窗口大小。防止重复渲染
函数节流
一个函数执行一次后,只有大于设定的执行周期后才会执行第二次
- 浏览器scroll事件
window.addEventListener('scroll',throttle(realFunc,100));
- 控制台打印num
var num = 0;
function realFunc() {
console.log(num++);
}
- 函数节流
var start = 0;
function throttle(func, time) {
if (!start) {
start = Date.now();
}
var delay = Date.now();
if (delay - start > time) {
func();
start = 0;
}
}
间隔一段时间执行一次回调的场景有:
- 滚动加载,加载更多或滚到底部监听
- 谷歌搜索框,搜索联想功能
- 高频点击提交,表单重复提交
总结
节流函数不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而防抖动只是在最后一次事件后才触发一次函数。
推荐学习文档:函数的防抖节流