最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 手撕防抖和节流

    正文概述 掘金(芋圆1392)   2021-01-19   426

    在开发过程中,总会遇到函数需要防抖和节流的情况,我将从以下几个方面来刨析防抖和节流

    1.什么是防抖和节流

    函数防抖

    在频繁触发的模式下,我们只识别 “一次” 「识别第一次、也可以只识别最后一次」

    函数节流

    降低触发的频率,它能识别 “多次” 「浏览器有自己的最快反应时间,例如:谷歌57ms IE1017ms,这样在我们的疯狂操作下,谷歌浏览器的频率是5ms执行一次,节流是降低这个频率,比如我们设定频率是300ms,在疯狂触发的时候,我们控制间隔300ms才让其执行一次」

    2.防抖和节流的使用场景

    点击事件一般以 防抖为主「但是有些需求也是节流」 键盘输入事件 或者 滚动条滚动事件 都是以 节流为主

    3.函数防抖debounce

    假设fn()是我们触发的点击事件,debounce()函数执行后,需要将fn()执行结果返回

    function debounce(func) {
        return function proxy() {
            func()
        }
    }
    

    传递的参数中也应该包括wait 频率时间immediate 是否立即执行

    传递参数的过程中可能会出现以下几种情况

     debounce(fn)
     debounce(fn,300)
     debounce(fn,true)
     debounce(fn,300,true)
    

    针对这几种情况,需要对传递的参数做以下判断处理

         /**
             * debounce  函数防抖
             *  @params
             *      func[functio]需要执行的函数
             *      wait[number]延时的时间,默认300
             *      immediate[boolean]是否立即执行,默认false
             *  @return
             *      func执行的结果
            */
        function debounce(func,wait,immediate) {
            if(typeof func !== 'function') throw new TypeError('func is not a');
            if(typeof wait === 'boolean'){
                immediate = wait;
                wait = 300;
            }
            if(typeof wait !== 'number') wait = 300;
            if(typeof immediate !== 'boolean') immediate = false;
            return function proxy() {
                func()
            }
        }
    

    接下来,该处理核心代码,防抖就是在一定时间内不能触发多次只生效一次; 一定时间内,那我们就设置一个定时器,来控制是否执行下一次操作; 但是当我们马上点击第二次的时候,定时器就应该重新设置,再次等待300ms,所以需要做以下处理;

    function debounce(func,wait,immediate) {
            if(typeof func !== 'function') throw new TypeError('func is not a');
            if(typeof wait === 'boolean'){
                immediate = wait;
                wait = 300;
            }
            if(typeof wait !== 'number') wait = 300;
            if(typeof immediate !== 'boolean') immediate = false;
    
            var timer = null;
            return function proxy() {
                if(timer)clearTimeout(timer);
                timer = setTimeout(function () {
                    if(timer){
                        clearTimeout(timer);
                        timer = null;
                    }
                    func();
                },wait);
            }
        }
    

    还差最后一步,需要设置立即执行;如果immediate为true,那就不需要先执行定时器,而是应该先执行函数func(),但是需要在判断一下,立即执行是否是在上一个定时器执行完毕。

    function debounce(func,wait,immediate) {
            if(typeof func !== 'function') throw new TypeError('func is not a');
            if(typeof wait === 'boolean'){
                immediate = wait;
                wait = 300;
            }
            if(typeof wait !== 'number') wait = 300;
            if(typeof immediate !== 'boolean') immediate = false;
    
            var timer = null;
            return function proxy() {
                var isNow = !timer && immediate;//timer为null代表上一个定时器执行完毕,可以再次“立即执行”
                if(timer)clearTimeout(timer);
                timer = setTimeout(function () {
                    if(timer){
                        clearTimeout(timer);
                        timer = null;
                    };
                    !immediate?func():null;
                },wait);
                isNow?func():null;
            }
        }
    

    未完待续...


    起源地下载网 » 手撕防抖和节流

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元