JavaScript 防抖与节流——以游戏智慧解锁实战奥秘

news2024/12/27 14:04:17

在这里插入图片描述

🔥 个人主页:空白诗

在这里插入图片描述

文章目录

    • 🎮 引言
    • ❓ 什么是防抖和节流
    • 🏹 防抖(Debounce) - 锁定追击,精确无误
      • 📌 基础概念
      • 📌 适用场景
      • 📌 实战代码:防抖 应用于输入框的实时搜索
    • 🌀 节流(Throttle) - 技能冷却,战略部署
      • 📌 基础概念
      • 📌 适用场景
      • 📌 实战代码:节流 应用于点击按钮事件
    • 🏆 结语
    • 🔗 相关链接

🎮 引言

在前端开发的实践里,确保用户界面流畅且高效是至关重要的。面对诸如窗口滚动、输入监听等高频触发事件,防抖(Debounce) 节流(Throttle) 技术成为了优化性能、提升用户体验的关键策略。本篇学习笔记旨在通过直接的概念阐述、详尽的原理分析及实战代码示例(含注释),帮助你全面掌握这两种优化方法。🌟

❓ 什么是防抖和节流

「防抖」(Debounce)和「节流」(Throttle)是两种在软件开发中用来优化高性能需求环境下事件处理的技术,主要目的是限制函数的执行频率,从而减少不必要的计算负担,提高程序效率,尤其是在处理高频触发的事件如用户输入、滚动事件或窗口大小调整时。
在这里插入图片描述


🏹 防抖(Debounce) - 锁定追击,精确无误

📌 基础概念

「防抖」的核心在于,当一个动作被触发时,并不立即执行相应函数,而是设置一个延迟(等待)时间。若在这个延迟时间内再次触发该动作,则重新开始计时,直到延迟时间结束后,函数才会被执行一次。此机制有效避免了因短时间内频繁操作而造成的资源浪费。

📌 适用场景

「防抖」非常适合用于处理那些用户连续且快速的操作,如表单的实时验证、搜索框的自动完成建议。它确保在用户停止操作后才进行响应,比如键盘输入停止后才发送请求获取搜索建议,这样可以避免用户还在输入过程中就频繁发送请求

想象你是游戏中的一名狙击手,面对快速移动的目标。防抖技能就像是你的高级锁定系统:一旦发现敌人,你立刻启动锁定程序,但敌人如果在你完成锁定前不断变换位置,你的瞄准镜就会不断调整,重新开始锁定流程。只有当敌人在一段时间内保持静止(例如1秒),你的锁定系统才能最终确定目标位置,发射致命一击。这样一来,你确保了每一枪都是在最理想的条件下发射,避免了无谓的资源浪费。🎯

📌 实战代码:防抖 应用于输入框的实时搜索

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Debounce Input Example</title>
	<style>
        body { font-family: Arial, sans-serif; }
        #searchInput { width: 300px; padding: 10px; margin-bottom: 10px; }
        #searchResult { margin-top: 10px; }
	</style>
</head>
<body>

<h2>防抖输入框示例</h2>
<input type="text" id="searchInput" placeholder="尝试输入查询...">
<div id="searchResult">搜索结果将会在这里显示...</div>

<script>
	// 防抖函数
	function debounce(func, wait) {
		let timeout;
		return function(...args) {
			clearTimeout(timeout);
			timeout = setTimeout(() => func.apply(this, args), wait);
		};
	}

	// 模拟的搜索处理函数
	function simulateSearch(query) {
		console.log(`模拟搜索: "${query}"`);
		document.getElementById('searchResult').innerText = `模拟搜索结果: "${query}"`;
	}

	// 使用防抖的搜索处理
	const debouncedSearch = debounce(simulateSearch, 300);
	document.getElementById('searchInput').addEventListener('input', function(e) {
		debouncedSearch(e.target.value);
	});
</script>

</body>
</html>

这段代码是一个简单的示例,展示了如何使用防抖(debounce)技术来优化输入框(input)的实时搜索功能,以减少不必要的搜索请求。下面是对关键部分的解析:

HTML结构

  • 页面包含一个标题<h2>,说明这是防抖输入框的示例。
  • 一个输入框<input>,id为searchInput,用户可以在其中输入查询内容。它有一个占位符文本,提示用户尝试输入查询。
  • 一个<div>元素,id为searchResult,用来显示模拟的搜索结果。

CSS样式

  • 页面整体字体设置为Arial,备选sans-serif,保证良好的可读性。
  • 输入框宽度设为300px,内外边距设置为美观。
  • 结果展示区域searchResult有一个上外边距,使其视觉上与输入框有所区分。

JavaScript逻辑

  1. 防抖函数 (debounce): 这是一个通用的防抖函数实现,接收两个参数:要执行的函数func和等待时间wait(单位为毫秒)。内部使用了一个timeout变量来跟踪定时器,每次调用时先清除之前的定时器,然后重新设置,确保在最后一次调用后的wait毫秒后才执行func

  2. 模拟的搜索处理函数 (simulateSearch): 这个函数模拟了实际的搜索处理逻辑,它接收一个参数query,表示用户的查询字符串,并在控制台打印出模拟的搜索信息,同时更新页面上的searchResult元素的内容,显示模拟的搜索结果。

  3. 防抖搜索处理应用 : 通过debounce函数包装simulateSearch函数,得到debouncedSearch。然后,给searchInputinput事件添加了一个事件监听器,当用户在输入框中输入时,触发debouncedSearch。这样,只有当用户停止输入超过300毫秒后,模拟的搜索函数才会执行,有效地减少了因快速连续输入导致的过多搜索请求。

综上所述,这个示例通过防抖技术提高了搜索功能的效率,减少了不必要的服务器负担,同时也提升了用户体验,因为用户在连续输入时不会看到频繁变化的搜索结果,只有在他们停止输入足够长的时间后,才会看到最新的搜索结果。


🌀 节流(Throttle) - 技能冷却,战略部署

📌 基础概念

「节流」则是在指定的时间间隔内,无论触发多少次事件,都只执行一次预先设定的函数。这意味着,即使事件连续触发,也会按照固定的频率来执行回调,从而控制执行频率,达到资源优化的目的。

📌 适用场景

「节流」适用于那些需要在连续事件中保持一定响应频率的场景,如滚动事件处理、窗口大小调整时的重绘操作。它可以帮助维持动画的流畅性,同时避免过度渲染导致的性能损耗

转换到法师角色,你掌握着一场战斗中最强大的法术,但每一次释放都需要巨大的魔力和时间恢复。节流技能就像你的魔法技能冷却系统:一旦释放,不论敌人是否已被击败,你都需要等待一段冷却时间(CD)才能再次使用该技能。🔮

📌 实战代码:节流 应用于点击按钮事件

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Throttle Button Click Example</title>
	<style>
        body { font-family: Arial, sans-serif; }
        #clickButton { padding: 10px 20px; background-color: #007BFF; color: white; border: none; cursor: pointer; }
        #clickCount { margin-top: 10px; }
	</style>
</head>
<body>

<h2>节流按钮点击示例</h2>
<button id="clickButton">点击我</button>
<div id="clickCount">已点击次数: 0</div>

<script>
	// 节流函数
	function throttle(func, limit) {
		let inThrottle, lastExec = 0;
		return function(...args) {
			const now = new Date().getTime();
			if (!inThrottle) {
				func.apply(this, args);
				lastExec = now;
				inThrottle = true;
			} else if (now - lastExec >= limit) {
				func.apply(this, args);
				lastExec = now;
			}
			setTimeout(() => inThrottle = false, limit - (now - lastExec));
		};
	}

	let clickCount = 0;

	// 模拟的点击处理函数
	function handleClick() {
		console.log("按钮点击");
		document.getElementById('clickCount').innerText = `已点击次数: ${++clickCount}`;
	}

	// 使用节流的点击处理
	const throttledClick = throttle(handleClick, 1000);
	document.getElementById('clickButton').addEventListener('click', throttledClick);
</script>

</body>
</html>

这段代码展示了一个利用节流(throttle)技术来控制按钮点击事件处理的应用实例。下面是对其关键部分的解析:

HTML结构

  • 页面包含一个标题<h2>,说明这是一个节流按钮点击的示例。
  • 一个蓝色的按钮<button>,id为clickButton,鼓励用户点击。
  • 一个<div>元素,id为clickCount,初始显示已点击次数为0,用于反映点击处理的结果。

CSS样式

  • 设置了页面字体,以及按钮的样式,包括背景色、文字颜色、边框和光标样式,使得按钮在视觉上更加吸引人点击。
  • 为点击计数的<div>设置了外边距,保持页面布局的整洁。

JavaScript逻辑

  1. 节流函数 (throttle): 实现了节流逻辑,接受一个函数func和一个时间间隔limit作为参数。它通过维护一个状态变量inThrottle来追踪当前是否在冷却时间内,以及lastExec记录上次执行的时间。当函数被调用时,计算自上次执行以来经过的时间,如果不在冷却期内或已超过指定间隔,则执行函数,并更新最后执行时间。最后设置定时器,在冷却期结束后重置inThrottle

  2. 点击计数变量 (clickCount): 初始化为0,用于记录按钮被点击的次数。

  3. 模拟的点击处理函数 (handleClick): 点击时被调用的函数,简单地在控制台打印“按钮点击”,并更新页面上的点击次数显示。

  4. 节流点击处理应用 : 通过throttle函数包装handleClick,得到throttledClick,确保该函数在任何连续点击事件中,至少有1秒的间隔才会执行一次。然后,给按钮的click事件添加了一个事件监听器,使用throttledClick作为处理函数。

总结来说,这个示例演示了如何利用节流技术来限制用户快速连续点击按钮时的响应次数,从而避免了因过于频繁的点击处理导致的性能问题。用户点击按钮后,至少要等待1秒钟,计数才会再次增加,这有助于控制频繁操作带来的副作用,提升了用户体验和应用性能。


🏆 结语

防抖(Debounce)节流(Throttle) 作为前端性能优化的两种关键技术,它们的核心机制及其应用场景如下:

📌 防抖(Debounce)

  • 核心机制:防抖确保一个函数在触发后的等待期内,若再次被触发,则重新计算等待时间,仅当所有触发操作停止后的一段时间内没有新的触发,函数才会执行一次。这种方式有效过滤了短时间内连续的重复调用,特别适合于那些不需对每个输入变化都立即响应的场景,如表单验证、搜索建议等。
  • 应用场景示例:在实时搜索输入框中,用户连续快速输入字符时,防抖确保只在用户完成输入并暂停后发起搜索请求,减少不必要的后台查询。

📌 节流(Throttle)

  • 核心机制:节流确保函数在给定的时间间隔内至多执行一次,即使该事件在此期间被触发多次。它按照固定的频率执行回调,维持执行的频率上限,适用于那些需要限制执行速率但仍需保持一定频率响应的场景。
  • 应用场景示例:滚动事件处理中,使用节流来控制滚动事件的处理逻辑,如加载更多内容或更新滚动位置指示器,以确保即使快速滚动也不会造成处理逻辑的过度执行。

📌 实践代码回顾

  • 防抖应用:通过在输入框的input事件上应用防抖处理,确保在用户停止输入后才执行搜索模拟,优化了用户体验并减轻了服务器压力。
  • 节流应用:在按钮点击事件上的节流实现,控制了即使用户快速连续点击,处理逻辑(如点击计数)也保持固定间隔执行,防止了不必要的资源消耗。

综上所述,防抖节流虽机制不同,但目的相同:优化性能、提升用户体验。选择哪种技术取决于具体需求:

  • 若需确保动作停止后再响应,减少无用功,防抖是优选。
  • 若需在频繁操作中维持稳定频率执行,而不限制最后执行,节流更为合适。

通过合理应用这两项技术,开发者能够构建出响应迅速且资源高效的前端应用,为用户提供流畅无阻的交互体验。


🔗 相关链接

  • JavaScript 中的 Class 类
  • JavaScript中call、apply与bind的区别
  • JavaScript 垃圾回收机制深度解析:内存管理的艺术
  • 深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略
  • 深入理解JavaScript事件循环Event Loop:宏任务与微任务的奇幻之旅

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FANUC机器人工具坐标偏移的用法

一、工具坐标偏移的使用场景 在机器人位置不改变的情况下&#xff0c;工业机器人使用默认工具坐标系示教的一系列运动点位&#xff0c;要保持原本点位位置不变的情况下&#xff0c;改变机器人工具坐标的参数&#xff0c;就要用到机器人坐标转化的功能。在FANUC机器人上体现为机…

基于Django实现的校园疫情监控平台

基于Django实现的校园疫情监控平台 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 系统功能实现 登录注册功能 用户在没有登录自己的用户名之前只能浏览本网站的首页&#xff0c;想要使用其他功能都会…

百度GL地图实现某一段路的路况(new BMapGL.DrivingRouteLine)

功能描述&#xff1a; 1.百度地图实现点击地图出现起点&#xff0c;再次点击出现终点&#xff08;起点终点能拖动&#xff09;绘制完终点后获取该路的路况并且起点和终点可以拖动实现实时更新&#xff08;新绘制的路段的&#xff09;路况 2.地点搜索 效果如下&#xff1a; 关键…

Python计算器程序代码

from tkinter import * import random class App: def __init__(self, master): self.master master self.initwidgets() #表达式的值 self.expr None def initwidgets(self): #定义一个输入组件 self.show Label(relief SUNKEN, font (Courier New, 24), width 25, bg …

taro3兼容支付宝/微信小程序的自定义拖拽排序组件

描述&#xff1a;列表可以完成拖拽排序 此组件是根据支付宝原生文档改编成taro-vue3的形式&#xff0c;只保留了拖拽的部分&#xff0c;其他功能都去除了&#xff0c;测试下来可以兼容支付宝和微信小程序。 支付宝原生文档&#xff1a; https://opendocs.alipay.com/support/…

0X JavaSE-- UML、

# Unified Modeling Language UML 统一建模语言 UML 是一种图形化的语言。 UML 不是专门为 Java 准备的。 只要是面向对象的编程语言&#xff0c;开发前的设计&#xff0c;都需要画 UML 图进行系统设计。 最常用的四个 UML 图是 类图&#xff08;Class Diagram&#xff09;&…

【JavaEE】Maven简介与实用指南:项目构建和依赖管理的高效工具

目录 Maven什么是 Maven为什么学 Maven创建一个Maven项目依赖传递依赖排除 Maven 仓库本地仓库中央仓库私服 Maven设置国内源配置当前项⽬setting设置新项⽬的setting Maven 什么是 Maven 官⽅对于 Maven 的描述: Maven 是⼀个项⽬管理⼯具。基于 POM(Project Object Model,…

RS3236-ADJ8YF5功能和参数介绍及PDF资料

RS3236-ADJ8YF5功能和参数介绍及PDF资料-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 品牌: RUNIC(润石) 封装: SOT-23-5 描述: 输出电压可调(参考电压0.81V),Iout500mA(Max),Vin7.5V(Max),带过温保护 输出类型: 可调 最大输入电压: 7.5V 输出电压: 810mV~6.6V 最大输出电流…

C语言学习(九)多文件编程 存储类型 结构体

目录 一、多文件编程&#xff08;一&#xff09;不写头文件的方方式进行多文件编程 &#xff08;二&#xff09;通过头文件方式进行多文件编程&#xff08;1&#xff09;方法&#xff08;2&#xff09;头文件守卫 &#xff08;三&#xff09; 使用多文件编程实现 - * / 功能 二…

Rust学习笔记(上)

前言 笔记的内容主要参考与《Rust 程序设计语言》&#xff0c;一些也参考了《通过例子学 Rust》和《Rust语言圣经》。 Rust学习笔记分为上中下&#xff0c;其它两个地址在Rust学习笔记&#xff08;中&#xff09;和Rust学习笔记&#xff08;下&#xff09;。 编译与运行 Ru…

LeetCode - 0088 合并两个有序数组

题目地址&#xff1a;https://leetcode.cn/problems/merge-sorted-array/description/ 引言&#xff1a;话接上回&#xff0c;由于上次面试官着急下班&#xff0c;面试不得不提前终止&#xff0c;这不&#xff0c;他又找我去面试了 面试官&#xff1a;你好&#xff0c;小伙子&a…

(二刷)代码随想录第4天|24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点

24. 两两交换链表中的节点 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 帮你把链表细节学清楚&#xff01; | LeetCode&#xff1a;24. 两两交换链表中的节点_哔哩哔哩_bilibili 给你一个链表&#xff0c;两两交换其…

电影网站|基于SSM+vue的电影网站系统(源码+数据库+文档)

电影网站 目录 基于SSMvue的电影网站系统 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道…

C语言 | Leetcode C语言题解之第83题删除排序链表中的重复元素

题目&#xff1a; 题解&#xff1a; struct ListNode* deleteDuplicates(struct ListNode* head) {if (!head) {return head;}struct ListNode* cur head;while (cur->next) {if (cur->val cur->next->val) {cur->next cur->next->next;} else {cur …

Rancher-Kubewarden-保姆级教学-含Demo测试

一、什么是Kubewarden&#xff1f; What is Kubewarden? | Kubewarden 1、就是容器集群的准入策略引擎。 1、使用的策略其实就是k8s原生的security context. 2、使用WebAssembly来编写策略。 1、WebAssembly&#xff0c;可以使用擅长的开发语言来编写策略。&#xff08;下面的…

撤销 git add 操作(忽略被追踪的文件)

文章目录 引言I git rm命令来取消暂存【推荐】II 撤销特定文件的暂存状态2.1 git rese2.2 git restoresee also引言 应用场景: 修改.gitignoregitignore只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先…

Python 开发 框架安全:Django SQL注入漏洞测试.(CVE-2021-35042)

什么是 Django 框架 Django 是一个用 Python 编写的 Web 应用程序框架。它提供了许多工具和库&#xff0c;使得开发 Web 应用程序变得更加容易和高效。Django 遵循了“MTV”&#xff08;模型-模板-视图&#xff09;的设计模式&#xff0c;将应用程序的不同组件分离开来&#x…

【智能算法】鹭鹰优化算法(SBOA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;Y Fu受到自然界中鹭鹰生存行为启发&#xff0c;提出了鹭鹰优化算法&#xff08;Secretary Bird Optimization Algorithm, SBOA&#xff09;。 2.算法原理 2.1算法思想…

stl学习以及abc比赛例题

1.引例 一提到查找&#xff0c;我们一上来想的肯定是find()函数或者search()函数&#xff0c;但是这种查找的底层逻辑终究是用顺序查找的方式&#xff0c;运行的时间成本非常高昂&#xff0c;所以平时能不用就不用&#xff0c;比赛的时候用这种查找和自己while遍历&#xff0c…

哈希表(unordered_set、unordered_map)

文章目录 一、unordered_set、unordered_map的介绍二、哈希表的建立方法2.1闭散列2.2开散列&#xff08;哈希桶/拉链法&#xff09; 三、闭散列代码&#xff08;除留余数法&#xff09;四、开散列代码&#xff08;拉链法/哈希桶&#xff09; 一、unordered_set、unordered_map的…