节流与防抖(附代码)

简介: 节流与防抖(附代码)

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

节流:

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

应用场景:

  1. 游戏中的一些设计--王者荣耀 英雄的普攻;
  2. 监听页面的滚动事件;
  3. 鼠标移动事件;
  4. 用户频繁点击按钮操作;

实现方式:

//第三方库实现
<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. 输入框中频繁的输入内容,搜索或者提交信息;
  2. 频繁的点击按钮,触发某个事件;
  3. 监听浏览器滚动事件,完成某些特定操作;
  4. 用户缩放浏览器的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>


目录
相关文章
|
5月前
|
算法
还不会防抖和节流?看这篇就足够了
还不会防抖和节流?看这篇就足够了
|
监控 前端开发
前端经典面试题 | 理解 节流 和 防抖(后附手写节流\防抖)
前端经典面试题 | 理解 节流 和 防抖(后附手写节流\防抖)
什么是防抖和节流,怎么实现一个防抖和节流?
功能:当事件被触发N秒之后再执行回调,如果在N秒内被触发,则重新计时。
|
UED
防抖和节流怎么做
防抖和节流都是为了控制代码执行频率,提高性能和用户体验。
35 0
面试官:防抖和节流的区别是啥?实现一个防抖和节流函数(一)
面试官:防抖和节流的区别是啥?实现一个防抖和节流函数(一)
|
前端开发
什么是防抖和节流?有什么区别?
什么是防抖和节流?有什么区别?
74 0
|
JavaScript 前端开发
什么是防抖和节流?如何实现防抖和节流?
防抖(debounce)和节流(throttle)是 JavaScript 中常用的两种性能优化方法。
|
前端开发
前端学习案例3-防抖和节流3
前端学习案例3-防抖和节流3
67 0
前端学习案例3-防抖和节流3
|
前端开发
前端学习案例1-防抖和节流1
前端学习案例1-防抖和节流1
68 0
前端学习案例1-防抖和节流1