给我解释下 前端开发中的防抖和节流 并举个具体的例子

防抖(Debounce)与节流(Throttle)详解

在前端开发中,防抖(Debounce) 和 节流(Throttle) 是两种优化高频触发事件的技术,用于提升性能和用户体验。它们的核心区别在于:

  • 防抖:将多次触发合并为一次执行(只执行最后一次)。
  • 节流:限制事件执行频率(按固定间隔执行)。

防抖(Debounce)

原理
  • 在事件被触发后,延迟 n 毫秒再执行回调。
  • 如果在这 n 毫秒内再次触发事件,则重新计时。
适用场景
  • 搜索框实时联想(用户停止输入后再请求)。
  • 窗口 resize 事件(只在调整结束后计算布局)。
  • 按钮提交防止重复点击。
代码示例

javascript

// 防抖函数(非立即执行版)
function debounce(fn, delay) {let timer = null;return function(...args) {// 清除上一次定时器if (timer) clearTimeout(timer);// 重新设置定时器,延迟执行timer = setTimeout(() => {fn.apply(this, args);}, delay);};
}// 使用示例
const searchInput = document.getElementById('search-input');
searchInput.addEventListener('input', debounce((e) => {console.log('搜索:', e.target.value);// 发送搜索请求...
}, 300));

节流(Throttle)

原理
  • 限制一个函数在一定时间内只能执行一次。
  • 即使在这段时间内多次触发事件,也只会按固定间隔执行。
适用场景
  • 滚动加载更多数据(每滚动一定距离触发一次)。
  • 高频点击按钮(如点赞、提交)。
  • 游戏中的技能冷却。
代码示例

javascript

// 节流函数(时间戳版)
function throttle(fn, limit) {let lastExecTime = 0;return function(...args) {const now = Date.now();// 如果距离上次执行超过限制时间,则执行if (now - lastExecTime > limit) {fn.apply(this, args);lastExecTime = now;}};
}// 使用示例
window.addEventListener('scroll', throttle(() => {console.log('滚动位置:', window.scrollY);// 检查是否需要加载更多数据...
}, 200));

对比与选择

特性防抖(Debounce)节流(Throttle)
执行时机只在最后一次事件触发后执行按固定间隔执行
高频触发只执行一次按频率执行多次
应用场景搜索联想、窗口 resize、防止重复提交滚动加载、高频点击、游戏技能冷却
实现方式定时器时间戳或定时器

高级实现(带配置选项)

防抖(支持立即执行)

javascript

function debounce(func, wait, immediate = false) {let timeout;return function() {const context = this;const args = arguments;const later = () => {timeout = null;if (!immediate) func.apply(context, args);};const callNow = immediate && !timeout;clearTimeout(timeout);timeout = setTimeout(later, wait);if (callNow) func.apply(context, args);};
}
节流(结合时间戳和定时器)

javascript

function throttle(func, limit) {let timeout;let lastExecTime = 0;return function() {const context = this;const args = arguments;const now = Date.now();const remaining = limit - (now - lastExecTime);if (remaining <= 0) {// 如果超过限制时间,立即执行if (timeout) {clearTimeout(timeout);timeout = null;}func.apply(context, args);lastExecTime = now;} else if (!timeout) {// 否则,等待剩余时间后执行timeout = setTimeout(() => {func.apply(context, args);lastExecTime = Date.now();timeout = null;}, remaining);}};
}

实际应用示例

1. 搜索框防抖

javascript

const searchInput = document.getElementById('search-input');searchInput.addEventListener('input', debounce((e) => {// 300ms 内没有新输入时才发送请求fetch(`/api/search?q=${e.target.value}`).then(res => res.json()).then(data => renderResults(data));
}, 300));
2. 滚动加载节流

javascript

window.addEventListener('scroll', throttle(() => {// 每 200ms 检查一次是否需要加载更多if (isScrollAtBottom()) {loadMoreData();}
}, 200));
3. 按钮点击防抖

javascript

const submitBtn = document.getElementById('submit-btn');submitBtn.addEventListener('click', debounce(() => {// 防止重复提交,2秒内只执行一次submitForm();
}, 2000, true)); // 立即执行版,点击后先执行,2秒内不再执行

总结

  • 防抖:适合需要合并多次触发的场景,避免不必要的计算或请求。
  • 节流:适合需要限制执行频率的场景,如滚动、拖拽等高频事件。

合理使用这两种技术可以显著提升应用性能,减少资源浪费,改善用户体验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/85361.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/85361.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/85361.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React-router 多类型历史记录栈

react-router 为了满足开发者更多路由历史存储场景&#xff0c;提供了以下几种模式&#xff1a; 浏览器原生历史记录 浏览器 hash 内存型 服务端记录 以上实现分别对应于一下 API 实现&#xff1a; createBrowserRouter&#xff1a;浏览器提供的历史管理。 createHashRou…

java设计模式[3]之结构型模式

文章目录 一 代理模式1.1 静态代理1.1.1 静态代理的结构1.1.2 静态代理的特点1.1.3 静态代理的应用场景1.1.4 静态代理的案例代码 1.2 JDK动态代理1.2.1 JDK动态代理概述1.2.2 JDK动态代理案例代码1.2.3 JDK动态代理的应用场景1.2.4 JDK动态代理的特点1.2.5 与创建型模式的区别…

鸿蒙Harmony测试-wukong稳定性工具(类似Android的Monkey测试)

一、功能介绍 wukong是系统自带的一种命令行工具&#xff0c;支持Ability的随机事件注入、控件注入、异常捕获、报告生成和对Ability数据遍历截图等特性。通过模拟用户行为&#xff0c;对系统或应用进行稳定性压力测试。wukong分为随机测试、专项测试和专注测试。 随机测试是指…

从零学起VIM

前言 笔者早年刚入行的时候就接触过Vim,当时还是真正的菜鸟&#xff0c;带我的师父是一个华为骨干员工&#xff0c;犹记得他给我指导如何保存并关闭文本&#xff1a;按Esc&#xff0c;然后输入:wq。还记得自己打开Vim编辑器&#xff0c;一个字符都敲不进去&#xff0c;然后问旁…

不依赖rerank 模型排序通过使用 PostgreSQL 中的 pgvector 与 tsearch2 函数进行混合搜索提高召回率

前言 在向量搜索中&#xff0c;召回率是一个关键指标&#xff0c;它衡量搜索结果的相关性。然而&#xff0c;提高召回率往往会牺牲其他指标&#xff0c;如索引大小或查询延迟。为了平衡这些权衡&#xff0c;混合搜索技术应运而生。本文将介绍如何在 PostgreSQL 中结合 pgvecto…

Uniapp 跨平台开发框架全面解析:一次开发,多端运行

在移动互联网时代&#xff0c;开发者面临着一个重要挑战&#xff1a;如何高效地开发出能在多个平台&#xff08;iOS、Android、Web、小程序等&#xff09;上运行的应用&#xff1f;传统的原生开发方式需要为每个平台单独编写代码&#xff0c;导致开发周期长、维护成本高。而 Un…

ios如何把H5网页变成主屏幕webapp应用

一、将 H5 页面添加到主屏幕的步骤 打开 Safari 浏览器 在 iPhone 上打开 Safari 浏览器&#xff0c;访问目标网页&#xff08;H5 页面&#xff09;。 点击分享按钮 在 Safari 浏览器底部点击 “分享” 图标&#xff08;箭头向上的按钮&#xff09;。 添加到主屏幕 在分享菜单…

Node.js 项目启动命令大全 (形象版)

文章目录 Node.js 项目启动命令大全 &#x1f31f;✨&#xff08;形象版&#xff09;一、&#x1f50d; 如何查看项目启动命令&#xff08;魔法书目录&#xff09;package.json scripts 参数详解开发相关脚本测试相关脚本构建相关脚本代码质量相关脚本最佳实践 二、&#x1f68…

爱普特APT32F1104C8T6单片机 高抗干扰+硬件加密双保障

爱普特APT32F1104C8T6单片机深度解析 1. 产品定位 APT32F1104C8T6 是爱普特半导体&#xff08;APT&#xff09;推出的 32位高性能经济型单片机&#xff0c;基于 ARM Cortex-M0内核&#xff0c;采用 LQFP48封装&#xff0c;主打 高性价比、低功耗、强抗干扰&#xff0c;是替代进…

使用uni-app ios 打包流程

配置几个步骤即可 1、打包ios需要BundleID ID 2、证书私钥密码 3、信任文件证书文件 4、私钥证书 5、打包 6、获取打包后的ipa文件 7、通过爱思助手安装到iso手机上 8、完成 1、下载&#xff1a;App Uploader去获取我们想要的证书私钥等文件 2、下载完成解压后的文件如下打…

仿muduo库实现并发服务器

1.实现目标 仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器&#xff1a; 通过实现高并发服务器的组件&#xff0c;可以快速实现一个高并发服务器的搭建&#xff0c;并且&#xff0c;通过组内不同应用层协议的支持&#xff0c;可以快速完成高性能服务器的搭建…

迭代器模式:集合遍历的统一之道

引言&#xff1a;集合遍历的演进之路 在软件开发中&#xff0c;集合遍历是我们每天都要面对的基础操作。从最初的数组索引遍历到现代的流式处理&#xff0c;我们经历了&#xff1a; #mermaid-svg-KwTr9k8JgbwRTDhU {font-family:"trebuchet ms",verdana,arial,sans-…

Spring Security OAuth2 组件

我们来系统地讲解一下 Spring Security OAuth2 这个强大的组件。我会从概念、作用、核心组件&#xff0c;以及实际应用场景来为你剖析。 1. 什么是 Spring Security OAuth2&#xff1f; 简单来说&#xff0c;Spring Security OAuth2 是 Spring Security 框架的一个模块&#…

Redis的持久化功能

Redis的持久化功能能够将内存中的数据保存到磁盘&#xff0c;从而在重启后恢复数据。下面为你详细介绍Redis的两种主要持久化方式及其配置方法。 RDB&#xff08;Redis Database&#xff09;持久化 RDB持久化是通过生成某个时间点的数据集快照来实现的。它具有高性能的特点&a…

Chrome 将成为下一个 IE6

最近在技术圈刷到一个帖子&#xff0c;说&#xff1a;“Chrome 就快变成新的 IE6 了。” 乍一看有点危言耸听&#xff0c;但你一细品&#xff0c;发现还真挺像回事。 想当年&#xff1a;IE6 是怎么垮的&#xff1f; IE6 当年多风光&#xff1f;全球市场份额一度超过 90%&#…

Redis 配置文件详解redis.conf 从入门到实战

一、redis.conf 是什么&#xff1f; Redis 的配置文件&#xff08;默认命名为 redis.conf&#xff0c;Redis 8.0 之后改为 redis-full.conf&#xff09;控制着服务运行的各项参数。该文件采用以下结构&#xff1a; 指令名 参数1 参数2 ... 参数N例如&#xff1a; replicaof …

autoware docker的安装

前言 官方的安装说明&#xff1a; 官方的安装说明 安装前&#xff0c;请确认安装的硬件&#xff1a; CPU with 8 cores16GB RAM[Optional] NVIDIA GPU (4GB RAM) 满足需求 1. 安装软件依赖 这一步主要是安装三个软件&#xff1a; DockerNVIDIA Container Toolkit (pref…

AWS 解决方案深度剖析:Amazon QLDB — 构建可信赖、不可变的数据审计基石

导言&#xff1a;数据可信的挑战 在现代应用开发中&#xff0c;尤其是在金融、供应链、身份认证、政府事务、医疗记录管理等领域&#xff0c;数据完整性和历史追溯性至关重要。我们常常面临以下挑战&#xff1a; 审计困难&#xff1a; 如何证明数据从诞生至今未被篡改&#xf…

Leetcode-​1358. 包含所有三种字符的子字符串数目​

Problem: 1358. 包含所有三种字符的子字符串数目 思路 滑动窗口 解题过程 滑动窗口&#xff1a;使用左右指针 l 和 r 维护一个窗口&#xff0c;窗口内字符的频次由 cnt 记录。 右指针扩展&#xff1a;右指针 r 不断右移&#xff0c;将字符加入窗口并更新频率。 左指针收缩&a…

iTunes 无法备份 iPhone:10 种解决方法

Apple 设备是移动设备市场上最先进的产品之一&#xff0c;但有些人遇到过 iTunes 因出现错误而无法备份 iPhone 的情况。iTunes 拒绝备份 iPhone 时&#xff0c;可能会令人非常沮丧。不过&#xff0c;幸运的是&#xff0c;我们有 10 种有效的方法可以解决这个问题。您可以按照以…