JavaScript节流和防抖

Posted 码妈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript节流和防抖相关的知识,希望对你有一定的参考价值。

节流和防抖的区别
函数节流是减少连续的高频操作函数执行次数 (例如连续调用10次, 可能只执行3-4次)
函数防抖是让连续的高频操作时函数只执行一次(例如连续调用10次, 但是只会执行1次)

节流(throttle)

函数节流应用场景
oninput / onmousemove / onscroll / onresize等事件

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>节流throttle</title>
  <style>
    *{
      margin: 0;
      padding: 0;
    }
    div{
      width: 200px;
      height: 200px;
      background: red;
      position: absolute;
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
    }
  </style>
</head>
<body>
<div></div>
<script>
  let oDiv = document.querySelector("div"); // 获取div
  function getScreen() {  // 封装好的获取网页宽高,有需要的也可以拿去使用
    let width, height;
    if(window.innerWidth){
      width = window.innerWidth;
      height = window.innerHeight;
    }else if(document.compatMode === "BackCompat"){
      width = document.body.clientWidth;
      height = document.body.clientHeight;
    }else{
      width = document.documentElement.clientWidth;
      height = document.documentElement.clientHeight;
    }
    return {
      width: width,
      height: height
    }
  }
  function resetSize(){
    let { width, height } = getScreen();
    // 设置div的宽高为网页宽高的一半
    oDiv.style.width = width / 2 + "px";
    oDiv.style.height = height / 2 + "px";
  }
  resetSize();
  let timerId = null;
  let flag = true;
  window.onresize = function () { // onresize获取或设置当前窗口
    if(!flag){ // 执行结果 if(false) if(true) if(false)
      return;
    }
    flag = false;
    timerId && clearTimeout(timerId); // 清空一次性定时器
    timerId = setTimeout(function () { // 开启一次性定时器
      flag = true;
      resetSize();
      console.log("尺寸的变化");
    }, 500); // 500毫秒后执行
    // resetSize(); // 不用防抖,浏览器窗口宽高每发生一变化就会发送一次请求
    // console.log("尺寸的变化");
  }
</script>
</body>
</html>

结果

改变窗口大小之前改变窗口大小之后
在这里插入图片描述在这里插入图片描述

防抖(debounce)

函数防抖应用场景
oninput / onmousemove / onscroll / onresize等事件

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>防抖debounce</title>
</head>
<body>
<input type="text">
<script>
  let oInput = document.querySelector("input"); // 获取input元素
  let timerId = null; // 用变量保存定时器的返回值
  oInput.oninput = function () { // input监听实时输入事件
    timerId && clearTimeout(timerId); // 清空一次性定时器
    timerId = setTimeout(function () { // 创建一次性定时器
      console.log("打印发送请求次数");
    }, 1000); // 1000毫秒后执行
    // console.log(this.value); // 不用节流,每输入一个字就会发送一次请求
    // console.log("打印发送请求次数");
  }
</script>
</body>
</html>

结果

快速输入123快速输入456
在这里插入图片描述在这里插入图片描述

以上是关于JavaScript节流和防抖的主要内容,如果未能解决你的问题,请参考以下文章

js节流和防抖

js的节流和防抖

120.节流和防抖,Vue中如何添加节流和防抖

120.节流和防抖,Vue中如何添加节流和防抖

节流和防抖的实现及其应用

函数节流和防抖