介绍防抖节流原理、区别以及应用,并用javascript进行实现

博客介绍了防抖和节流的原理、区别及应用,并给出JavaScript实现。防抖是事件触发后等待n秒执行回调,期间再触发则重新计时,适用于搜索框联想、按钮提交等场景;节流规定一定时间内函数只能触发一次,用于拖拽、缩放等场景。

介绍防抖节流原理、区别以及应用,并用javascript进行实现

防抖:当一个事件触发时候,需要等待n秒以后执行回调,如果在等待的n秒内该事件又被触发了,那么需要重新计时等待n秒。

使用场景:

  • 搜索框联想:防止联想发送请求,只发送最后一次
  • 按钮提交的场景,防止多次提交按钮,只执行最后一次提交

简单版本

<button class="debounce-btn">简单版防抖</button>
<script>
        // 防抖:在事件被触发n秒后再次执行回调,如果在这n秒内又被触发了,那么需要重新计时。
        // 适用的场景: 按钮提交的场景,防止多次提交按钮,只执行最后一次提交。
        //             搜索框联想场景,防止联想发送请求,只发送最后一次
        function debounce(fun, await) {
            let timeout = null;
            return function () {
                let context = this;
                let args = arguments;
                if (timeout) {
                    clearTimeout(timeout)
                }
                timeout = setTimeout(function () {
                    fun.apply(context, args)
                }, await)
            }
        }
        function add() {
            console.log('简单版防抖')
        }
        document.querySelector('.debounce-btn').onclick = debounce(add, 2000)
    </script>

立即执行版本

<button class="immediate-btn">立刻执行版防抖</button>
<script>
     // 立即执行版本
     function immediateDebounce(fun, await, immediate) {
         let timeout = null;
         return function () {
             let context = this;
             let args = arguments;
             if (timeout) {
                 clearTimeout(timeout) 
             }
             if (immediate) {
                 let callNow = !timeout;
                 timeout = setTimeout(function(){
                     timeout = null
                 },await)
                 console.log(timeout)
                 
                 if(callNow){
                     fun.apply(context,args);
                 }
             } else {
                 timeout = setTimeout(function () {
                     fun.apply(context, args)
                 }, await)
             }
         }
     }
     function immediateAdd() {
         console.log('立刻执行版防抖')
     }
     document.querySelector('.immediate-btn').onclick = immediateDebounce(immediateAdd, 2000, true)
    </script>

节流:规定一定时间内只能触发一次函数,即使当前被触发了多少发送事件,但是也只生效一次
使用场景:

  • 拖拽场景:固定时间内只执行一次,防止超高频次触发位置变动
  • 缩放场景:监控浏览器resize

使用定时器实现

 <button class="throttle-setTimeout">节流定时器实现</button>
  <script>
         function throttle(fn,await){
            let canSend=true;
            return function(){
                let context = this;
                let args = arguments;
                if(!canSend) return false;
                canSend = false;
                setTimeout(function(){
                    canSend = true;
                    fn.apply(context,args)
                },await)
            }
        }
        function fun(){
            console.log('定时器节流')
        }
        document.querySelector('.throttle-setTimeout').onclick=throttle(fun,2000);
    </script>

使用时间戳实现:
使用时间戳,当触发事件的时候,我们去除当前的时间戳,然后减去指点的时间戳(最一开始值设置为0),如果大于设置的时间周期,就执行函数,然后更新时间戳为当前的时间戳,如果小于,就不执行。

<button class="throttle-setTimeout">节流时间戳实现</button>
  <script>
        function throttle(func, await) {
            let previous = 0;
            return function () {
                let now = + new Date();
                let context = this;
                args = arguments;
                if (now - previous > await) {
                    func.apply(context, args)
                    previous = now
                }
            }
        }
        function fun(){
            console.log('时间戳节流')
        }
        document.querySelector('.throttle-setTimeout').onclick=throttle(fun,2000);
    </script>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值