当前位置: 首页 > news >正文

前端小技巧: 防抖和节流的区别

一、防抖 Debounce

1 )简单描述

  • 防止抖动,防止你抖动过程中,执行下一步,等你停止了,再执行下一步
  • 场景:输入框,等输入停止或者间歇,才去做
    • 监听一个输入框,文字变化后出发change事件
    • 直接用keyup,则会频繁出发change事件
    • 用户输入或暂停时,才触发change事件
  • 注意,如果用户连续触发,清理之前的

2 )代码实现

const input = document.getElementById('input')// 防抖 封装
function debounce(fn, delay = 500) {// timer 是闭包中的let timer = nullreturn function () {if (timer) clearTimeout(timer);timer = setTimeout(() => {// 注意这里的this, 结合下面的调用,fn不能是箭头函数fn.apply(this, arguments)// fn(); // 这样也可以,但是不如上面全面timer = null}, delay)}
}input.addEventListener('keyup', debounce(function (e) {console.log(e.target)console.log(input1.value)
}, 600))

二、节流 Throttle

1 )简单描述

  • 节流,节省交互沟通
  • 按照时间节奏来,插队者无效
  • 场景
    • drag 或 scroll 期间触发某个回调,要设置一个时间间隔
      • 拖拽一个元素,要随时拿到该元素被拖拽的位置
      • 直接用drag事件,则会频繁触发,导致卡顿
      • 节流的目的是无论拖拽速度多快,每隔一定时间才去触发一次
    • 轮播图的左右按钮
    • 关注/取消关注的点击

2 )代码实现

const div = document.getElementById('div');// 节流的封装
function throttle(fn, delay = 100) {let timer = nullreturn function () {if (timer) return;timer = setTimeout(() => {// 注意,这种写法,arguments是为了获取下面的efn.apply(this, arguments)timer = null}, delay)}
}div.addEventListener('drag', throttle(function (e) {console.log(e.offsetX, e.offsetY)
}))
  • 等当前结束再执行,可加哨兵变量或者直接使用 timer 来判断
  • 一般而言100的delay即可,场景是 拖拽、滚动时展示 坐标

总结

  • 节流:限制执行的频率,有节奏的执行,关注过程
  • 防抖:限制执行次数,多次密集触发只执行一次,关注结果

相关文章:

  • 根据json生成Java类
  • 关于navigator.userAgent判断苹果手机的问题和踩坑
  • Java中的反射机制
  • 09-MySQL主从复制
  • idea 一直卡在maven正在解析maven依赖
  • asp.net core 生命周期
  • SpringBoot Kafka消费者 多kafka配置
  • 【星海出品】flask(一)demo
  • 【Nginx39】Nginx学习:upstream服务器组模块
  • 教给孩子们如何认真听讲
  • windowCPU虚拟化已禁用解决方案
  • AIX5.3安装weblogic10.3
  • 已解决:rm: 无法删除“/opt/module/zookeeper-3.4.10/zkData/zookeeper_server.pid“: 权限不够
  • 【23真题】简单!原题很多!211!
  • IEC104 工具和代码库
  • [译]Python中的类属性与实例属性的区别
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Codepen 每日精选(2018-3-25)
  • echarts花样作死的坑
  • ESLint简单操作
  • JavaScript的使用你知道几种?(上)
  • Java多线程(4):使用线程池执行定时任务
  • PAT A1092
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • React系列之 Redux 架构模式
  • SQLServer之创建显式事务
  • text-decoration与color属性
  • 阿里云Kubernetes容器服务上体验Knative
  • 反思总结然后整装待发
  • 基于组件的设计工作流与界面抽象
  • 数据可视化之 Sankey 桑基图的实现
  • 数组大概知多少
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • # 数论-逆元
  • #git 撤消对文件的更改
  • #stm32驱动外设模块总结w5500模块
  • #Z0458. 树的中心2
  • (175)FPGA门控时钟技术
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (四)模仿学习-完成后台管理页面查询
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)jQuery 基础
  • .equals()到底是什么意思?
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .Net8 Blazor 尝鲜
  • .NET开发不可不知、不可不用的辅助类(一)
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • /var/log/cvslog 太大
  • @Autowired @Resource @Qualifier的区别
  • @Autowired 与@Resource的区别
  • @Import注解详解
  • @Transactional类内部访问失效原因详解
  • @取消转义