JavaScript,一分钟理解 高频率触发事件 的解决,防抖和节流!!!

985 阅读1分钟

前言

高频率触发事件,onscroll / onresize 是高频率触发事件,还有比如疯狂点击,点击事件频繁的触发等事件一直容易被触发,造成很大的性能问题。

什么是防抖和节流

函数防抖(debounce): 触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。 --- 每次点击,点了以后立即清除定时器

函数节流(throttle): 高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。 --- 点击一次,就把事情干完,没干完之前点击没用

举个栗子

函数防抖

//body的高度设置多些,能够触发onsroll事件
   var t;
        window.onscroll = function() {
            clearTimeout(t);
            t = setTimeout(function() {
                console.log(888);
            }, 300)
        }

结果如下分析 : 没有函数防抖的话,那么触发一下滚动条滑动事件,打印888将会打印非常多,防抖之后,可以看打印的数量少之又少
image.png

函数节流

一个常见的例子,在获取验证码的时候,一般都是60s之后可以重新获取,在那期间,获取验证码按钮是不可以点击的。所以肯定要用带表单里面的禁用属性disable,值为布尔值(注意: 点击事件频繁触发,点击事件是叠加的)

 <button id="btn">获取验证码</button>
    <script>
        //函数节流,事件处理完了才能进行下一件
        var oBtn = document.getElementById('btn')
        
         //点击事件
        oBtn.onclick = function() {
            //disabled为禁用
            oBtn.disabled = true;
            oBtn.style = "background:#666;"
            var count = 10;
            oBtn.innerHTML = count + 's后可重新获取'

            //定时器
            var t = setInterval(function() {
                count--;
                oBtn.innerHTML = count + 's后可重新获取'
                if (count <= 0) {
                    //条件满足后,清除定时器
                    clearInterval(t);
                    oBtn.innerHTML = '获取验证码'
                    oBtn.disabled = false;
                    oBtn.style = "background:#E5E5E5;"
                }
            }, 1000)
        }
    </script>

结果如下 :此时按钮已经被禁用,定时器结束后才能再次触发点击事件,从而降低了事件触发的频率,可解决高频率触发事件。

image.png