No.40 JavaScript---防抖(debounce)、节流(throttle)

news/2025/3/10 9:31:09/文章来源:https://www.cnblogs.com/bltstop/p/18758115

一、防抖

1.含义

  • 防抖严格算起来应该属于性能优化的知识,但实际上遇到的频率相当高,处理不当或者放任不管就容易引起浏览器卡死。

2.从滚动条监听的例子说起

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>h3{height: 500px;}</style>
</head>
<body><h3>hah1</h3><h3>hah1</h3><h3>hah1</h3><h3>hah1</h3><h3>hah1</h3><h3>hah1</h3><script>//滚动事件window.onscroll = scrollHandle;function scrollHandle(){var scrollTop = document.documentElement.scrollTop; //滚动条距顶部的高度console.log(scrollTop);}</script>
</body>
</html>

  

在运行的时候会发现存在一个问题:这个函数的默认执行频率,太!高!了!。高到什么程度呢?以chrome为例,我们可以点击选中一个页面的滚动条,然后点击一次键盘的【向下方向键】,会发现函数执行了8-9次!

 

  • 然而实际上我们并不需要如此高频的反馈,毕竟浏览器的性能是有限的,不应该浪费在这里,所以接着讨论如何优化这种场景。
  • 基于上述场景,首先提出第一种思路:在第一次触发事件时,不立即执行函数,而是给出一个期限值比如200ms,然后
    • ① 如果在200ms内没有再次触发滚动事件,那么就执行函数
    • ②如果在200ms内再次触发滚动事件,那么当前的计时取消,重新开始计时
    • 效果:如果短时间内大量触发同一事件,只会执行一次函数

 

 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>h3{height: 500px;}</style>
</head>
<body><h3>hah1</h3><h3>hah1</h3><h3>hah1</h3><h3>hah1</h3><h3>hah1</h3><h3>hah1</h3><script>//滚动事件
        function debounce(fn,delay){var timer = null;//闭包return function(){if(timer){clearTimeout(timer)}timer = setTimeout(fn,delay)}} window.onscroll = debounce(scrollHandle,200);function scrollHandle(){var scrollTop = document.documentElement.scrollTop;console.log(scrollTop);}</script>
</body>
</html>

  

 

 到这里,已经把防抖实现了。

 

3.定义

  • 对于短时间内连续触发的事件(上面的滚动事件),防抖的含义就是让某个时间期限(如上面的1000毫秒)内,事件处理函数只执行一次。

 

二、节流

  • 节流严格算起来应该属于性能优化的知识,但实际上遇到的频率相当高,处理不当或者放任不管就容易引起浏览器卡死。(和防抖一样)
  • 上面防抖的效果有个小问题,就是用户按住滚动条拖动不放的时候,200ms也不会打印,直到放开滚动条才会打印。所以用节流来解决这个问题。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>h3{height: 500px;}</style>
</head>
<body><h3>hah1</h3><h3>hah1</h3><h3>hah1</h3><h3>hah1</h3><h3>hah1</h3><h3>hah1</h3><script>//滚动事件
        function throttle(fn,delay){var valid = true;return function(){if(!valid){return false; }valid = false;setTimeout(function(){fn();valid = true;},delay)}}window.onscroll = throttle(scrollHandle,2000);function scrollHandle(){var scrollTop = document.documentElement.scrollTop;console.log(scrollTop);}</script>
</body>
</html>

  

 

三、应用场景

百度是实时搜索

 

 

 

 

 

 

 

 

 

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

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

相关文章

IDEA 必备插件!轻松搞定 JSON 格式化!

Json Assistant —— 基于 IntelliJ IDEs 的 JSON 工具插件,支持 IntelliJ IDEA、DataGrip、PyCharm Professional、WebStorm 等常用的 IDE 工具!大家好,我是 Java陈序员。 在日常开发中,常常会遇到 JSON 数据的处理,可以借助一些在线 JSON 工具网站,进行处理。 但是,经…

绩效考核的优势

来源:tita.com 绩效评估是对员工绩效的系统评估,旨在了解一个人进一步成长和发展的能力。绩效评估通常以系统的方式进行,如下所示:主管人员衡量员工的薪酬,并将其与目标和计划进行比较。 主管分析员工工作绩效背后的因素。 雇主可以指导员工取得更好的业绩。绩效考核目标 …

Spring AI与DeepSeek实战二:打造企业级智能体

一、概述 智能体 Agent 能自主执行任务实现特定目标的 AI 程序。传统 AI(如ChatGPT一、概述 智能体 Agent 能自主执行任务实现特定目标的 AI 程序。传统 AI(如ChatGPT)主要依靠用户输入指令,而智能体 Agent 可以自主思考、决策,并执行复杂任务,就像一个AI助手,能够独立完…

Vulnhub-Node

利用信息收集拿到路径得到账户密码,下载备份文件,base64解密后,利用fcrackzip爆破zip压缩包,得到一个文件,查看app.js,发现泄露的账户密码,连接ssh,成功连接,利用ubuntu历史版本漏洞提权 一、靶机搭建 选择扫描虚拟机选择路径即可开启靶机二、信息收集 靶机信息 name:…

[AIGC/Agent] MCP:模型上下文协议

引言火爆 AI 编程圈的 MCP 到底是个什么东西?最近,如果你经常使用 AI 编程的话,肯定听到过 MCP 这个概念 那到底什么是 MCP 呢?MCP 定义先从专业角度讲,MCP 就是Anthropic(Claude) 主导发布的一个开放的、通用的、有共识的协议标准。 Model Context Protocol(MCP)MCP 功能…

飞驰云联荣获“2024年度十大信创安全品牌”第三名!

日前,由安东工作室携手北京信息灾备技术产业联盟信创工委会联合举办的“第二届年度十大信创品牌评选活动”榜单出炉,Ftrans飞驰云联凭借自主创新的技术实力、显著的行业信创成果等多项优势,荣获“2024年度十大信创安全品牌”第三名!在信创领域,Ftrans飞驰云联的核心技术自…

【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理

在 AI 编程领域国内外有一堆能叫的上号的应用:CursorWindsurfTrae阿里的「通义灵码」百度的「文心快码」字节跳动的「MarsCode」科大讯飞的「iFlyCode」GitHub 的「Copilot」等等等...这么多的 AI 编程应用,它们到底有什么区别? 这些编程应用的实现原理到底是什么样的? 如果…

2.24架构质量分析

某电子商务公司拟升级其会员与促销管理系统,向用户提供个性化服务,提高用户的粘性。在项目立项之初,公司领导层一致认为本次升级的主要目标是提升会员管理方式的灵活性,由于当前用户规模不大,业务也相对简单,系统性能方面不做过多考虑。新系统除了保持现有的四级固定会员…

【分享】文件摆渡系统,如何保障数据安全,促进业务协同发展?

在数字化浪潮的席卷下,企业的信息化建设不断推进,网络安全也日益受到重视。为了保护核心数据资产,许多企业采用了网络隔离技术,将内部网络划分为不同的区域,如内网与外网、办公网与研发网等。这种隔离措施在一定程度上有效抵御了外部网络攻击和数据泄露风险,然而,也给企…

20250310

今天有几个趋势需要确定: 1. 焦煤 https://www.cnblogs.com/lyonlee/p/18753748 2.沪锌 指标已经略微下穿 3 棉花

解密prompt系列50. RL用于优化Agent行为路径的一些思路

而Deep Research的效果类似O1的长思考是非常长的行为链,OpenAI也直接表明Deep Research是使用和O1相同的RL训练得到的。但这里比O1更难的就是数据集的设计,训练过程动态行为数据的引入和RL目标的选择。这一章我们分别介绍从两个不同角度使用RL优化Agent行为链路的方案,其中P…

读DAMA数据管理知识体系指南15数据库过程

读DAMA数据管理知识体系指南15数据库过程1. 列式数据库 1.1. 列式数据库(Column-oriented Database)能压缩冗余数据,通常用于商务智能(BI)的应用 1.2. 权衡1.2.1. 需要对很多行进行聚合计算时,面向列的存储组织方式会更加高效1.2.1.1. 这只适用于处理少数列的情况,因为读取少…