JavaScript节流与防抖函数封装

js节流与防抖函数封装

常见应用场景:

  • window的 resize 和 scroll 事件;
  • 文字输入时的 keyup 事件;
  • 元素拖拽、移动时的 mousemove 事件;

防抖

  • 定义:多次触发事件后,事件处理函数只执行一次,并且是在触发操作结束时执行
  • 原理:对处理函数进行延时操作,若设定的延时到来之前,再次触发事件,则清除上一次的延时操作定时器,重新定时。
  • 经典案例:百度输入内容自动搜索
    /**
    *防抖函数
    *@param fn 事件触发的操作
    *@param delay 多少毫秒内连续触发事件,不会执行
    *@returns {Function}
    */
    function debounce(fn,delay){
        let timer = null;
        return function(){
            let self = this,
                args = arguments;
            timer && clearTimeout(timer);
            timer = setTimeout(function(){
                fn.apply(self,args);
            },delay);
        } 
    }
    window.onscroll = debounce(function(){
        let scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
        console.log(scrollTop)
    },200)

  

节流

  • 定义:触发函数事件后,短时间间隔内无法连续调用,只有上一次函数执行后,过了规定的时间间隔,才能进行下一次的函数调用。
  • 原理:对处理函数进行延时操作,通过设定时间片,控制事件函数间断性的触发。
  • 经典案例:按钮可以多次点击发送请求问题
    /**
    * 节流函数
    * @param fn 事件触发的操作
    * @param mustDelay 间隔多少毫秒需要触发一次事件
    */
    function throttle(fn,mustDelay){
        let timer,
            start = 0;
        return function (){
            let now = new Date().getTime(),
                self = this,
                args = arguments;
            if(now > start + mustDelay){
                fn.apply(self,args)
                start = now;
            }
        }
    }
    window.onscroll =throttle(function(){
        let scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
        console.log(scrollTop)
    },200)

  

posted @ 2020-02-28 16:23  陌小江  阅读(297)  评论(0编辑  收藏  举报