防抖与节流方案_js史上最精简!防抖节流(你的比我精简,算我输)。

f4d56b02bf3964e0aa12f8b700a260d8.png

前言


作为前端开发人员,相信大家对防抖和截流早已是十分熟悉了,初次听说这个玩意儿的时候我的第一反应是

4a97059416642c381f9243b3932bf841.png

防抖,防止抖动?节流,节约流水??于是乎百度了一波,终于弄懂。   就是,为了防止事件在短时间内被多次触发的两种解决方案。网上巴拉巴拉一堆说法,   总结:   防抖:你狂点按钮也没有,等你冷静下来事件才会触发。   节流:游戏里面的技能冷却功能。

好的,然后呢?

然后呢?当然是百度一下ctrl+c,ctrl+v完成功能点啊,自己写??不存在的

7a4a8a51b8d7bb8432fb3ed9a2833d82.png

于是乎我找了一大堆案例总结几个例子大概是:

防抖:

//例子1function debounce(fn,delay=200){  let timer = null;  return function(){    if(timer) clearTimeout(timer);    timer = setTimeout(()=>{      fn.apply(this,arguments);      timer = null;    },delay);  }}//例子2function debounce(func, wait) {    let timeout;    return function () {        let context = this;        let args = arguments;        if (timeout) clearTimeout(timeout);            timeout = setTimeout(() => {            func.apply(context, args)            }, wait);        }}

节流:

//时间戳版function throttle(func, wait) {    let previous = 0;    return function() {        let now = Date.now();        let context = this;        let args = arguments;        if (now - previous > wait) {            func.apply(context, args);            previous = now;        }    }}throttle(count,1000);//定时器版function throttle(func, wait) {    let timeout;    return function() {        let context = this;        let args = arguments;        if (!timeout) {            timeout = setTimeout(() => {                timeout = null;                func.apply(context, args)            }, wait)        }    }}

看完这些代码:

什么玩意儿???这么麻烦的吗?防抖还好,大部分都能达到理想的效果,可是节流就没那么理想了。节流是技能冷却啊!就是要点一下立马触发,进入冷却,等冷却,结束继续能点。然而大多版本都是:点击等一会儿才触发,进入冷却。前面多了莫名的等待时间,不是立马触发的.......

3b809bccaed776cb9cb72a0a5187cc59.png

,做为一个强迫症患者,这不能忍。

于是乎,我决定自己撸一个。

e398e0bacf249ae904bf2ca7e7f7f0ba.png

总结了一些例子,折腾了一下。自己版本的防抖节流就出炉啦!!

2d5a452aea47b44faaed67e581abd58c.gif

防抖:

    let time2;    document.getElementById('防抖').onclick =    function () {        clearTimeout(time2);        time2=setTimeout(function () {            //做一些快乐的事情        },2000);    };

节流:

    let bool=true;        document.getElementById('节流').onclick = function () {        if(bool){            //做一些开心的事情            bool=false;            setTimeout(()=>{                bool=true            },2000)        }    }

测试了几下效果十分理想,代码精简,简单易懂。我觉得很ok!!

0bd107ffdd26b1dcb4a6533cc0380572.png

(为了方便阅读,在此不对函数进行封装)

结尾:

第一次,发文章感觉有点小激动!呀哈哈。以上内容如果有不足之处,望大家指点一二,如果有更精简的例子,更好的例子,望大家分享下。

680b5bbdaee45bbd763ff0f1ce8c5329.png

源自:https://juejin.im/post/5da7c77a51882554c0757f46

声明:文章著作权归作者所有,如有侵权,请联系小编删除。

感谢 · 转发欢迎大家留言

e6422768864f54bf60b4add56bf3b280.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值