节流与防抖(附代码)

正常,节流,防抖区别演示

节流:

特点:如果这个事件会被频繁触发,那么节流函数会按照一定的频率来执行函数,不管在这个中间有多少次触发这个事件,执行函数的频次总是固定的;

应用场景:

  1. 游戏中的一些设计--王者荣耀 英雄的普攻;

  1. 监听页面的滚动事件;

  1. 鼠标移动事件;

  1. 用户频繁点击按钮操作;

实现方式:

//第三方库实现
<input type="text"> <!--html标签-->

<script src="https://cdn.jsdelivr.net/npm/underscore@1.13.1/underscore-umd-min.js"></script>
<script>
const inputEl = document.querySelector("input")
let counter = 0
const inputChange = function(event) {
      console.log(`发送了第${++counter}次网络请求`, this, event)
}

// 节流处理
inputEl.oninput =_.throttle(inputChange, 2000)//当用户不断触发事件按照2秒的频率执行
</script>
//手动实现
//js   封装throttle方法
function throttle(fn, interval, options) {
    // 1.记录上一次的开始时间
    let lastTime = 0
  
    // 2.事件触发时, 真正执行的函数
    const _throttle = function(e) {
  
      // 2.1.获取当前事件触发时的时间
      const nowTime = new Date().getTime()
  
      // 2.2.使用当前触发的时间和之前的时间间隔以及上一次开始的时间, 计算出还剩余多长事件需要去触发函数
      const remainTime = interval - (nowTime - lastTime)
      if (remainTime <= 0) {
        // 2.3.真正触发函数
        fn.apply(this,[e])
        // 2.4.保留上次触发的时间
        lastTime = nowTime
      }
    }
  
    return _throttle
  }

//使用位置
<body>
    <input type="text">
</body>
<script src="./jieliu.js"></script>
<script>
    const inputEl = document.querySelector('input')
    let counter = 0
    const inputChange = function (e) {
        console.log(`发送了${++counter}次网络请求`, this, e);
    }
    inputEl.oninput = throttle(inputChange, 2000)
</script>

防抖:

特点:当事件触发时,相应的函数并不会立即触发,而是会等待一定的时间(非常短的时间),当事件密集触发时,函数的触发会被频繁的推迟,只有等待了一段时间也没有事件触发,才会真正的执行响应函数

应用场景:

  1. 输入框中频繁的输入内容,搜索或者提交信息;

  1. 频繁的点击按钮,触发某个事件;

  1. 监听浏览器滚动事件,完成某些特定操作;

  1. 用户缩放浏览器的resize事件;

实现方式:

//第三方库实现
<input type="text"> <!--html标签-->

<script src="https://cdn.jsdelivr.net/npm/underscore@1.13.1/underscore-umd-min.js"></script>
<script>
const inputEl = document.querySelector("input")
let counter = 0
const inputChange = function(event) {
      console.log(`发送了第${++counter}次网络请求`, this, event)
}

// 防抖处理
inputEl.oninput = _.debounce(inputChange, 2000)//当用户停止输入的时候延时2秒后执行
</script>
//手动实现
//js   封装debounce方法
function debounce(fn,timeout) {
    var timer
    return function(e) {
        if(timer){
            clearTimeout(timer)
        }
        timer = setTimeout(()=>{
            fn.apply(this,[e])
        },timeout)
    }
}

//使用位置
<body>
    <input type="text">
</body>
<script src="./fangdou.js"></script>
<script>
    const inputEl = document.querySelector('input')
    let counter = 0
    const inputChange = function(e) {
        console.log(`发送了${++counter}次网络请求`,this,e);
    }
    inputEl.oninput = debounce(inputChange,1000)
</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值