美文网首页JavaScript
JavaScript之防抖和节流

JavaScript之防抖和节流

作者: h2coder | 来源:发表于2023-07-20 00:25 被阅读0次

前言

防抖

  • 防抖和节流是一种性能优化手段,将频繁调用函数进行包装处理,防止频繁处理事件,导致性能损耗,例如接收到事件后更新localStorage

目的

  • 单位时间内,频繁触发事件,只执行最后一次(只要用户没有停下来,就不会执行,等到用户停下来了,最后才会执行)

应用场景

  • 输入框自动搜索
  • 按钮防暴击(频繁点击)
  • 手机号、邮箱等表单的输入延迟校验

封装函数

function debounce(callback, timeout) {
  let timerId;
  return function (...args) {
    // 此时的this,是DOM元素
    const that = this;
    // 清除上次的延时器,并再次开启延时器
    clearTimeout(timerId);
    timerId = setTimeout(() => {
      // 调用回调函数,并重新设置this为DOM元素,再把方法参数回传
      if (callback) {
        callback.apply(that, args);
      }
    }, timeout);
  };
}

使用案例

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>防抖函数实现</title>
  <style>
    .box {
      width: 500px;
      height: 500px;
      background-color: #ccc;
      color: #fff;
      text-align: center;
      font-size: 100px;
    }
  </style>
</head>

<body>
  <input type="text">
  <div class="box">0</div>
  <script>
    const input = document.querySelector('input');
    const box = document.querySelector('.box');

    // 延时自动搜索
    const handleInput = function (e) {
      console.log('发送搜索商品请求...');
    }
    input.addEventListener('input', debounce(handleInput, 1000));
  </script>
</body>

</html>

节流

目的

  • 单位时间内,频繁触发事件,按照固定频率执行(单位时间内,不能执行太多次,但一定会执行)

应用场景

  • 鼠标移动事件、页面尺寸改变事件、滚动条滚动事件、音频、视频的进度变化事件

封装函数

function throttle(callback, timeout) {
  // 延时器Id
  let timerId;
  return function (...args) {
    // 如果定时器正在运行,那么拦截调用
    if (!timerId) {
      // 调用回调函数,并设置this和方法参数
      callback.apply(this, args);
      // 开启延时器,时间到时,重置定时器Id变量
      timerId = setTimeout(() => {
        timerId = undefined;
      }, timeout);
    }
  }
}

使用案例

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>利用节流实现性能优化</title>
  <style>
    .box {
      width: 500px;
      height: 500px;
      background-color: #ccc;
      color: #fff;
      text-align: center;
      font-size: 100px;
    }
  </style>
</head>

<body>
  <div class="box"></div>
  <script>
    const box = document.querySelector('.box');

    // 节流,3秒内只能执行一次,下一次3秒才能执行下一次
    // 正常业务逻辑
    const fn = function (e) {
      box.innerText++;
    }
    // 鼠标移动事件
    box.addEventListener('mousemove', throttle(fn, 3000));
  </script>
</body>

</html>

相关文章

  • Javascript 基础

    1、函数防抖和函数节流 【《javascript高级程序设计》里,函数节流是这里讲的函数防抖。】函数防抖: 在事件...

  • javaScript之 防抖和节流

    需求:最近面试,面试官问说一下你项目中做了哪些优化?小哥哥:不由得想起了,防抖和节流。面试官:能不能手撕一下。老规...

  • 彻底弄懂函数防抖和函数节流

    函数防抖和节流 函数防抖和函数节流:是优化高频率执行的JavaScript代码的一种手段。常用于JavaScrip...

  • 函数防抖和函数节流

    函数防抖和函数节流 函数防抖和函数节流:是优化高频率执行的JavaScript代码的一种手段。常用于JavaScr...

  • JavaScript防抖和节流

    无论是防抖还是节流都是为了避免回调函数中的处理随着连续触发事件每次都执行 防抖和节流都是为了防止函数(事件)的连续...

  • 防抖和节流 javascript

    防抖(Debounce)指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执...

  • JavaScript防抖和节流

    前言 debounce(防抖)和throttle(节流)是两个相似的技术,都是为了减少一个函数无用的触发次数,以便...

  • JavaScript 节流和防抖

    什么是节流和防抖 节流和防抖的本质都是用闭包的形式,通过对事件对应的回调函数进行包裹,用自由变量缓存时间信息,最后...

  • JavaScript防抖和节流

    防抖和节流 相同:在不影响客户体验的前提下,将频繁的回调函数,进行次数缩减.避免大量计算导致的页面卡顿.不同:防抖...

  • JavaScript - 防抖和节流

    lodash工具库里有实现防抖和节流的函数 防抖和节流严格算起来应该属于性能优化的知识,但实际上遇到的频率相当高,...

网友评论

    本文标题:JavaScript之防抖和节流

    本文链接:https://www.haomeiwen.com/subject/wepoudtx.html