js实现防抖函数

2020-09-02  本文已影响0人  zhao_ran

函数防抖

当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定时间到来之前,又触发了事件,就重新开始延时。也就是说当一个用户一直触发这个函数,且每次触发函数的间隔小于既定时间,那么防抖的情况下只会执行一次。

上代码

// HTML部分
<body>
    <textarea name="" id="textarea" cols="30" rows="10">
    </textarea>
</body>
//script部分
<script>
    var textarea = document.getElementById('textarea')
    textarea.addEventListener('keydown', debounce(ajaxAction, 500))
    function ajaxAction() {
        console.log('可以发送ajax请求')
    }
    function debounce(fn, delay) {
        var timer = null; // 声明计时器
        return function () {
            var context = this;
            var args = arguments;
            clearTimeout(timer);
            timer = setTimeout(function () {
                fn.apply(context, args)
            }, delay);
        };
    }
</script>

函数节流-封装

/* 
        用来返回节流函数的工具函数
    */
    function throttle(callback, delay) {
      let pre = 0 // 默认值不要是Date.now() ==> 第1次事件立即调用
      return function (event) { // 节流函数/真正的事件回调函数   this是发生事件的标签
        const current = Date.now()
        if (current - pre > delay) { // 只有离上一次调用callback的时间差大于delay
          // 调用真正处理事件的函数, this是事件源, 参数是event
          callback.call(this, event)
          // 记录此次调用的时间
          pre = current
        }
      }
    }
    // 使用封装的节流函数
    document.addEventListener('scroll',throttle(function() {
      console.log('这是带有大量计算的函数')
    },2000))
上一篇 下一篇

猜你喜欢

热点阅读