JavaScript 防抖和节流

防抖

所谓防抖,就是把触发非常频繁的的事件合并成一次去执行,即在指定的时间内只执行一次回调函数,如果在指定时间内又触发事件,重新计时

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>防抖</title>
</head>
<button id="btn">点击</button>
<body>
<script>
  // 防抖debounce
  function debounce(fn,delayTime) {
    let timeId;
    return function () {
      const content = this;
      const arg = arguments;
      timeId && clearTimeout(timeId);

      timeId = setTimeout(function () {
        fn.apply(content,arg)
      },delayTime)

    }
  }

  // 点击按钮调用的函数
  function fn() {
    console.log(arguments)
    console.log('防抖------')
  }
    
  const btn = document.getElementById('btn');
  btn.addEventListener('click', debounce(fn,2000))

</script>
</body>
</html>

节流

所谓节流,是指频繁触发事件时,只会在指定的时间内执行回调函数,即触发事件间隔大于等于指定的时间才会执行回调函数

  1. 时间戳实现
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>节流 - 时间戳实现</title>
</head>
<button id="btn">点击</button>
<body>
<script>
  // 节流throttle
  function throttle(fn, delayTime) {
    let _start = Date.now();

    return function () {
      const content = this;
      const arg = arguments;
      const _now = Date.now();

      if((_now - _start) > delayTime) {
        fn.apply(content, arg);
        _start = Date.now();
      }
    }

  }
    
  // 点击按钮调用的函数
  function fn() {
    console.log('节流--fff-----')
  }
    
  const btn = document.getElementById('btn');
  btn.addEventListener('click', throttle(fn,2000))
</script>
</body>
</html>
  1. 定时器实现
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>节流 - 定时器实现</title>
</head>
<button id="btn">点击</button>
<body>
<script>
  // 节流throttle
  function throttle(fn, delayTime) {
    let timeId;
    return function () {
      const context = this;
      const arg = arguments;

      if(!timeId) {
        timeId = setTimeout(function () {
          fn.apply(context,arg);
          timeId = null;
        },delayTime)
      }
    }
  }

  // 点击按钮调用的函数
  function fn() {
    console.log('节流--fff-----')
  }
    
  const btn = document.getElementById('btn');
  btn.addEventListener('click', throttle(fn,2000))
</script>
</body>
</html>

注意:

  1. 使用时间戳方式,页面加载的时候就会开始计时,如果页面加载时间大于我们设定的delayTime,第一次触发事件回调的时候便会立即fn,并不会延迟。如果最后一次触发回调与前一次触发回调的时间差小于delayTime,则最后一次触发事件并不会执行fn;
  2. 使用定时器方式,我们第一次触发回调的时候才会开始计时,如果最后一次触发回调事件与前一次时间间隔小于delayTime,delayTime之后仍会执行fn。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值