一、函数防抖
(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秒内,不管怎么点,只执行一次。
