防抖(debounce)

2024-01-24 00:04
文章标签 防抖 debounce

本文主要是介绍防抖(debounce),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

防抖:单位时间内,频繁触发事件,只执行最后一次


所谓防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间

        现在有一个小栗子:鼠标在box中移动的时候,触发mouseMove事件,如果不防抖的话,每移动1像素就会调用mouseMove()函数,如果mouseMove()函数中存在大量操作dom等情况,会产生卡顿,这个时候我们考虑防抖:单位时间内,频繁触发mouseMove事件,只执行最后一次

实现方式:

1.lodash 提供的防抖来处理

<body><div class="box"></div><script src="./lodash.min.js"></script><script>const box = document.querySelector('.box')let i = 1  // 让这个变量++// 鼠标移动函数function mouseMove() {box.innerHTML = ++i// 如果里面存在大量操作 dom 的情况,可能会卡顿}// lodash 防抖的写法box.addEventListener('mousemove', _.debounce(mouseMove, 500))</script>
</body>

2.手写一个防抖函数来处理

防抖的核心就是利用定时器(setTimeout)来实现 :

  • 声明一个定时器变量
  • 当鼠标每次滑动都先判断是否有定时器了,如果有定时器先清除以前的定时器
  • 如果没有定时器则开启定时器,记得存到变量里面
  • 在定时器里面调用要执行的函数
<body><div class="box"></div><script>const box = document.querySelector('.box')let i = 1  // 让这个变量++// 鼠标移动函数function mouseMove() {box.innerHTML = ++i// 如果里面存在大量操作 dom 的情况,可能会卡顿}// 防抖函数function debounce(fn, t) {let timeIdreturn function () {// 如果有定时器就清除if (timeId) clearTimeout(timeId)// 开启定时器 200timeId = setTimeout(function () {fn()}, t)}}// box.addEventListener('mousemove', mouseMove)box.addEventListener('mousemove', debounce(mouseMove, 200))</script>

这篇关于防抖(debounce)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/637944

相关文章

Vue2电商项目(二) Home模块的开发;(还需要补充js节流和防抖的回顾链接)

文章目录 一、Home模块拆分1. 三级联动组件TypeNav2. 其余组件 二、发送请求的准备工作1. axios的二次封装2. 统一管理接口API----跨域3. nprogress进度条 三、 vuex模块开发四、TypeNav三级联动组件开发1. 动态展示三级联动数据2. 三级联动 动态背景(1)、方式一:CSS样式(2)、方式二:JS 3. 控制二三级数据隐藏与显示--绑定styl

前端防抖和节流函数的实现原理

在前端开发中,防抖(Debounce)和节流(Throttle)是两种常用的优化技术,它们主要用于减少事件处理函数的执行频率,从而提高程序性能和用户体验。 防抖(Debounce) 防抖的目的是确保一个操作在一段时间内只被执行一次。例如,当用户在一个输入框中快速连续输入文字时,我们可能希望只在用户停止输入之后的一小段时间后再去执行查询操作,以避免频繁触发不必要的API调用。 实现原理: 设

HOW - 支持防抖和远程加载的人员搜索组件(shadcn)

目录 特性一、使用示例二、具体组件实现三、解释1. 属性定义2. 状态管理3. 功能实现4. 渲染逻辑 特性 支持 focus 时即发起请求获取用户列表输入时 debounce 防抖选中后以 tag 形式展示选项,这次点击 x 删除搜索结果中若包含已选项会过滤,即隐藏已选中项支持设置指定选项 disabled 一、使用示例 shadcn - multiple-selecto

Vue3 + TypeScript 实现防抖(Debounce)和节流(Throttle)

在Vue3项目中结合TypeScript使用防抖(Debounce)和节流(Throttle)技术,可以有效提升应用的性能和用户体验,尤其是在处理频繁触发的事件(如滚动、窗口大小调整、输入框内容变化等)时。下面将详细介绍这两种技术的原理、使用方法以及适用场景。 一、防抖(Debounce) 原理: 防抖技术通过延迟函数的执行来减少函数的调用频率。在事件被触发n秒后再执行回调,如果在这

debounce函数

当在扩展一个Angular应用的时候,巨大的数据集导致$digest()循环运行缓慢,处理这个$digest()循环延迟问题的方案是使用debounce函数。提示:debounce函数是指,只要它一直在被调用,它就不会被触发,直到它不再被调用的X毫秒后。   e.g: 1 < input  ng-model = "user.name"  ng-model-options = "{

网页性能优化03-函数防抖

1.1-函数防抖 1.函数防抖介绍 1.什么是函数防抖? (debounce) 网上主流解释:函数防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。 参考博客:https://www.jianshu.com/p/f9f6b637fd6c参考博客:https://segmentfault.com/a/1190000018445196 笔

Javascript归纳与总结——this指向及其改变、new关键字与原型链、异步、闭包和函数防抖与节流

this指向及其改变 普通函数在调用时,this为obj.obj1.fun(),this->obj1,箭头函数在声明定义时this->obj。 Javascript中bind、call、apply區別-CSDN博客 new关键字与原型链  从原型链视角解读VueComponent与Vue关系_vue中重要的原型链关系-CSDN博客 prototype这个属性只有函数对象才有!(构造)

什么是防抖和节流?

前言 在进行窗口调整(resize)、滚动(scroll)以及输入框内容校验等操作时,若事件处理函数频繁调用,可能会给浏览器带来极大负担,从而导致用户体验变差。为了优化性能,我们可以使用防抖(debounce)和节流(throttle)技术来控制函数的调用频率,从而提高应用的效率和流畅度。它们的核心思想是通过设置时间间隔来限制函数的执行时机。 防抖(Debounce) 防抖技术的关键在于:在

防抖与节流详细讲解

一、前言 在前端的面试中我们经常会听到面试官问到什么是防抖与节流?会需要我们详细的讲解他们各自的用法,以及不同点。 为此特地全面的讲解一下防抖与节流,在加深对二者的理解,同时方便大家参考。首先提出几个问题,希望大家带着问题来看这篇文章: 什么是防抖与节流?他们之间有什么联系,为什么总是一起问?他们之间的不同点是什么?他们各自的使用场景是什么?如何封装防抖与节流 二、防抖(debounce)

前端手写源码系列(一)—— 手写防抖和节流

目录 1.实现防抖函数(debounce)2.实现节流函数(throttle)时间戳的方式:定时器方式: 3.总结 1.实现防抖函数(debounce) 防抖函数原理:把触发非常频繁的事件合并成一次去执行 在指定时间内只执行一次回调函数,如果在指定的时间内又触发了该事件,则回调函数的执行时间会基于此刻重新开始计算 函数防抖是指在事件被触发 n 秒后再执行回调,如果在这