首页 > 其他分享 >防抖和节流

防抖和节流

时间:2024-07-18 14:57:51浏览次数:13  
标签:function 防抖 console 节流 nowTime let 计时器 函数

1. 防抖,回城-执行完成区间计时的一次

限时内,多次触发,只执行最后一次,并清空计时器。未计时完就一直清除计时器。

思路:利用闭包,保存回调函数的计时器。判断计时器是否存在,是-清除原计时器。计时器内调用事件处理函数。

注意:这里要搞清楚返回的匿名函数才是绑定的点击事件,而非 debounce 函数。匿名函数可以访问父函数 debounce 声明的 timer,每次调用匿名函数时,timer 的数据得到保留。

<button>防抖-计时器</button>
<button>防抖-非计时器</button>

// 使用计时器
let btn = document.querySelector('button');
btn.addEventListener('click', debounce(handler));
// 事件处理函数
function handler(e) {
  console.log(e);			//!未传入参数时为undefine
  console.log(this);	//!未修改时为window
}
// 防抖函数
function debounce(fn) {
  let timer;
  // 新的事件会覆盖旧的事件,直到最后一件事等待1s后执行
  return function (e) {						// 返回作为回调事件
    let _this = this;							// 注意:es5中计时器的this只能指向window,用箭头函数可继承父业
    if (timer) clearTimeout(timer);
    timer = setTimeout(function () {
      // 传入函数调用,提高可复用性
      fn.call(_this, e); //!修改this,得去记,得去用啊宝宝:call/bind/apply
    }, 1000)
  }
}

也可以用节流的计时方式。

// 不使用计时器
let btn1 = document.querySelector('.liu');
btn1.addEventListener('click', (function () {
    let currTime = Date.now();
    return function (e) {
      let nowTime = Date.now();
      if (nowTime - currTime < 3000) { // 时效内点击,刷新计时器
          currTime = nowTime;
          return;
      }
      // 调用处理函数
      console.log(e)
      console.log(this)
      currTime = nowTime; // 处理完毕,刷新计时器
    }
})())

2. 节流,只执行第一次-区间内禁止触发第二次

思路:记录第一次执行调用的时间戳,超时才能执行下一次调用,并重置起始时间。

限时内,多次触发,只执行第一次,直到计时结束。(合理来说应该是直到第一个执行完毕,可以设置标记,执行完修改标记,作为锁)

?疑问:这里的标记,如果是c++存在指针,可以传引用,事件处理函数可以直接修改指针值,js 没有可以使用指针一说,要怎样实现指针的能力?

// 节流:多次触发,只执行第一个,直到第一个执行完
window.addEventListener('scroll', throttle(handlerScroll, 1000));
// 事件处理函数
function handlerScroll(e) {
  console.log(e);
  console.log(this);
}
// 节流函数
function throttle(fn, delay) {
  let prevTime = Date.now();
  return function (...arg) {
    let nowTime = Date.now();
    if (nowTime - prevTime > delay) { // 区间计时结束,执行处理,并刷新起始时间
      fn.apply(this, arg);
      prevTime = Date.now();
    }
  }
}

标签:function,防抖,console,节流,nowTime,let,计时器,函数
From: https://www.cnblogs.com/chaofanhaochi/p/18309510

相关文章

  • 低开开发笔记(八): 低代码编辑器实现撤销回退(命令模式,防抖处理)
    好家伙, 0.代码已开源https://github.com/Fattiger4399/ph_questionnaire-.git 1.事件触发我们先从事件的触发开始讲起大致上我们有两个思路可以选择1.监控用户行为2.监控数据变化 两种选择都会有较难处理的部分,这里我们先选第二个选项 关于监控数据,首......
  • 木舟0基础学习Java的第十八天(IO流,字节流,字符流,缓冲)
    IO流正常使用流程:1.抛异常 2.资源读写 3.关闭资源(从后往前关)字节流:(拷贝推荐使用)开发中一般不会抛出异常用try{}catch(){}也不推荐字节流读中文FileInputStream:读FileInputStreamfs=newFileInputStream("e:/b.txt");//11111111为-1的补......
  • 固定表头和首列,防抖节流
    <style>#SetLimitAddtd{line-height:20px;padding-top:5px;padding-bottom:5px;}#wrapper{}.container-fluid{width:1747px;/*实际显示区域*/overflow-x:auto;padding-right:auto;......
  • 温故而知新,详细讲讲JavaScript的防抖与节流
    前言:哈喽,大家好,我是前端菜鸟的自我修养!今天给大家详细讲讲JavaScript的防抖与节流,包含二者的区别与优缺点、使用场景,并提供具体代码帮助大家深入理解,彻底掌握!原创不易,如果能帮助到带大家,欢迎收藏+关注哦......
  • 从搜索框的提示词中再探防抖和节流
    前言最近逛掘金时,看到了一篇文章。发现是我之前写过的一篇文章主题是防抖和节流的,看防抖时没感觉哪里不一样,但是当我看到节流时发现他的节流怎么这么繁琐(・∀・(・∀・(・∀・*)?抱着疑惑的想法,我仔细拜读了这篇文章。嗯。。好家伙不得不说大佬就是大佬,考虑的确实真的很细......
  • 防抖与节流机制
    防抖与节流:本质上是优化高频率执行代码的一种手段浏览器的resize、scroll、keypress、mousemove等事件在触发时,会不断地调用绑定在事件上的回调函数,极大地浪费资源,降低前端性能为了优化体验,需要对这类事件进行调用次数的限制,对此我们就可以采用防抖(debounce)和节流(throttle......
  • 防抖ref如何在vue中被定义
    本文由ChatMoney团队出品为什么ref要实现防抖在vue的开发过程中,我们通常会使用到ref,但在我们需要对一个频繁的赋值操作做防抖操作时,我们通常只能通过编写一个独立的防抖函数来实现,这样相对会多一些步骤(麻烦一些)。例如我们给一个即时搜索框的input实现防抖输入(即在输入文本n秒......
  • 在vue中定义一个防抖ref
    本文由ChatMoney团队出品为什么ref要实现防抖在vue的开发过程中,我们通常会使用到ref,但在我们需要对一个频繁的赋值操作做防抖操作时,我们通常只能通过编写一个独立的防抖函数来实现,这样相对会多一些步骤(麻烦一些)。例如我们给一个即时搜索框的input实现防抖输入(即在输入文本n秒......
  • 防抖和节流的概念理解
    防抖:在事件被触发的n秒后执行回调,如果在这n秒内又被触发,则重新计时。<script>vartimer=null,functionfangdou(fn,delay){ clearTimeOut(timer) timer=setTimeOut(fn,delay)}functioncheckout(input){ fangdou(function(){ show(input.value) },1000)}functionsh......
  • uniapp中防抖函数debounce的使用
    uniapp中防抖函数debounce的使用分段控件u-subsection每次点击一个tab的时候都会ajax访问一次接口取列表数据的,这时如果有人快速在多个分段间快速点击的话,每次点击都会访问接口的,网上找了好多资料,终于找到了这个玩意。。。记得以前也弄过这个的。。不过当时没有记下来,现在记下来......