首页 > 其他 > 详细

04-防抖和节流

时间:2021-03-17 22:56:41      阅读:32      评论:0      收藏:0      [点我收藏+]

先简明扼要概括一下:

-- 区别:

函数防抖是单位时间内只执行一次;

函数节流是间隔时间执行,不管事件触发有多么的频繁,都会保证在规定时间内执行一次真正的事件处理函数。


 

-- 原理:

防抖是维护一个计时器,规定在delay时间后触发函数,但是在delay时间内再次触发的话,都会清除当前的 timer 然后重新设置超时调用,即重新计时。这样一来,只有最后一次操作能被触发

节流是通过判断是否到达一定时间来触发函数,若没到规定时间则使用计时器延后,而下一次事件则会重新设定计时器。


 

防抖:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>Document</title>
  <style>
    body{
      height: 3000px;
    }
  </style>
</head>
<body>
    <input type="text" id="inp">
</body>
</html>

<script>
let oInp=document.getElementById(inp);
function nice(fn,time){
  let timer =null;
  return arg=>{
      clearTimeout(timer);
      timer=setTimeout(()=>{
        fn.call(this,arg)
      },time)
  }
}
let getFn = nice(ajax,1000);
function ajax(data){
  console.log(data,"我拿到数据了");
}

// 键盘事件
oInp.addEventListener(keyup,(e)=>{
  getFn(e.target.value)
});

// 滚动条滚动事件
document.body.onscroll=function(e){
  getFn(e.timeStamp)
}

</script>

节流:(包含了防抖)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>Document</title>
  <style>
    body{
      height: 3000px;
    }
  </style>
</head>
<body>
    <input type="text" id="inp">
</body>
</html>

<script>
let oInp=document.getElementById(inp);
function nice(fn,time){
  let last, 
      timer =null;
  return arg=>{
    // 每次操作事件(滚动/输入)触发时,都会得到一个最新的时间毫秒数
    let now = Date.now();
    //如果上一次存在(有操作)并且上一次的时间+定时器间隔时间 > 现在的时间,说明现在这个操作是在我定时器触发的时间内的,
    if(last && last + time > now){
      // 那么下一次再进来,就要清除之前的定时器,重新计时。这是做了防抖
      // 那就把之前的定时器清除重新计时,1S后执行函数。
      clearTimeout(timer);
      timer=setTimeout(()=>{
        last=now;    // 每次重新更新上一次的时间,这样在定时器间隔时间内,last+time 就会永远> now,造成if条件恒成立,也就会1秒执行一次事件函数
        fn.call(this,arg)
      },time)
    }else{   //初始状态或操作间隔>定时器时间(1s),就会立即执行(ajax函数)
      last = now;   // 每次重新更新上一次的时间
      fn.call(this,arg)
    }
  }
}
let getFn = nice(ajax,1000);
function ajax(data){
  console.log(data,"我拿到数据了");
}

// 键盘事件
oInp.addEventListener(keydown,(e)=>{
  getFn(e.target.value)
});

// 滚动条滚动事件
document.body.onscroll=function(e){
  getFn(e.timeStamp)
}

</script>

以上代码可以运行一下去感受一下。

 

参考:

https://zhuanlan.zhihu.com/p/51608574

04-防抖和节流

原文:https://www.cnblogs.com/haoqiyouyu/p/14551182.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!