一、函数防抖
(1)一定事件段内,只执行一次函数。
(2)间隔时间段内触发该事件,重新开始计时(创造新的Timeout)。
function debonce (fn){
let timer = null;
return function(){
clearTimeout(timer);
timer = setTimeout(fn,3000)
}
}
function eventHandler (){
console.log('click')
}
function bindEvent (){
let theDom = document.querySelector('#ua93bef8c'),
debouncedCallback = debonce(eventHandler);
theDom.onclick = debouncedCallback;
//绑定原生点击事件 onclick 不是驼峰命名
}
bindEvent()
封装防抖函数
(1)第一次是否立即执行回调函数(比如提交数据时第一次不延迟)
(2)间隔时间
(3)加上清楚防抖的功能
function eventHandler (){
console.log('click')
}
function bindEvent (){
let theDom = document.querySelector('#ua93bef8c'),
debouncedCallback = debonce(eventHandler, 4000, true);
theDom.onclick = debouncedCallback;
//绑定原生点击事件 onclick 不是驼峰命名
}
bindEvent()
function debonce(fn,time,triggerImmediately){
let timer = null;
let debounce = function(){
if(timer){
clearTimeout(timer)
}
let args = [...arguments],
_self = this;
//先判断是否立即触发函数
if(triggerImmediately){
let excute = !timer;
timer = setTimeout(()=>{
timer = null
},time)
if(excute){
fn.apply(_self, args)
}
}else{
timer = setTimeout(()=>{
fn.apply(_self, args)
}, time)
}
}
debounce.remove = ()=>{
clearTimeout(timer)
timer = null
}
}
三、节流
一段间隔时间内,只执行一次事件
function throttle (fn,waitingTime){
let prevTime = new Date().getTime(),
timer = null;
return function(){
if(timer) clearTimeout(timer)
let currentTime = new Date().getTime(),
_self = this,
args = [...arguments];
if( (currentTime - prevTime) >= waitingTime){
fn.apply(_self, args)
prevTime = currentTime
}else{
timer = setTimeout(function(){ fn.apply(_self, args) },waitingTime)
}
}
}
四、防抖与节流的区别
防抖:n秒内,无论怎么触发事件,都不执行。
节流:n秒内,无论怎么触发事件,只执行一次。
应用场景:
看具体需求
(1)输入查询,间隔时间发送请求 => 节流
(2)数据请求按钮点击 => 防抖,节流都行。 防抖,n秒内只执行一次。 节流,n秒内,不管怎么点,只执行一次。