防抖和节流的区别和用法

一.区别

防抖

防抖的主要作用时为了防止在少量时间内,每一次相同的行为都执行事情,即防止无意的抖动行为,其主要的特点是在一个相同连续的行为中,只执行最后一次行为所监听的事件。如提交表单的按钮,如果在同一时间大量点击按钮,我们使用防抖技术,只执行最后一次的点击事件,这个可以节约大量的api请求。

节流

防抖的主要作用时为了防止在多中重复的行为中,每一次相同的行为都执行事情,虽然这点和防抖很像,但是节流的主要特点是在一个相同连续的行为中,每隔一个时间,只执行一次行为所监听的事件。如鼠标移动小球的行为,如果没有使用节流,每次移动都会触发鼠标移动事件,而使用节流,每隔20ms才触发事件,能够达到差不多的效果,但是触发事件的数量少了很多。

二.实现和对比

防抖

dom结构

<div>
    <button id="btn" type="button">点击</button>
</div>   

没有使用防抖的情况

js

    let btn = document.getElementById("btn");
    btn.onclick = ()=>{
         setTimeout(()=>{
              console.log("已点击");
         },1000)
    }

效果图

102

没有防抖的时候 每次点击都会触发一遍事件。

使用防抖

js

        let btn = document.getElementById("btn");
        let time = null;
        btn.onclick = () => {
            // 关键在于每次点击都清除前一次的定时器 保留最后一次的定时器
            clearTimeout(time);
            time = setTimeout(() => {
                console.log("已点击");
            }, 1000)
        }

效果图

103

使用防抖时,只有做后一次点击生效了,可以防止大量重复点击

节流

dom结构

<div>
        <div style="width: 50px;height: 50px;border-radius: 50%;background-color: red;position: absolute;" id="round">
        </div>
    </div>

没有使用节流的情况

js

    let btn = document.getElementById("btn");
    btn.onclick = ()=>{
         setTimeout(()=>{
              console.log("已点击");
         },1000)
    }

效果图

104

没有节流的时候 一段时间都会触发一遍事件。

使用节流

js

 let round = document.getElementById("round");
 // 设置一个控制能够生成定时器的变量,每次执行都置为false,只有定时器执行时才置为true,这样,每隔一段时间才会执行时间
 let time = true;
 round.onmousemove = (event) => {
     if (time) {
          time = false;
          setTimeout(() => {
          console.log(1);
          round.style.top = event.pageY - 20 + 'px';
          round.style.left = event.pageX - 20 + 'px';
          time = true;
          },20);
     }
}

效果图

105

使用节流时,每隔20ms执行一遍事件,效果和原来的差不多,但是执行事件数量大大减少,节省了很多的性能
hxy

hxy

秦 夏

留下你的评论

快留下你的小秘密吧