解锁Web性能的秘密武器:掌握防抖与节流技术

防抖和节流

在现代Web开发中,提升应用性能和用户体验是至关重要的。防抖(Debouncing)和节流(Throttling)是两种常见的技术,它们通过减少事件处理函数的执行频率来达到这一目标。尽管它们的目的相似,但它们的应用场景、优点以及实现方式各有特点。

概念

  • 防抖:当事件被触发后,会等待一段时间再执行操作。如果在这段等待时间内事件再次被触发,则重新开始计时。
  • 节流:在一定时间间隔内,事件处理函数只会被执行一次,无论事件在这段时间内被触发多少次。

应用场景

防抖的应用场景:

  1. 搜索框实时搜索:避免用户每输入一个字符就发送一次请求,减少服务器压力和网络资源消耗。
  2. 窗口大小调整(resize):只在用户完成窗口大小调整后执行操作,提高响应效率。
  3. 表单验证:用户停止输入一段时间后才进行验证,提升用户体验。

节流的应用场景:

  1. 按钮防重复点击:防止用户短时间内重复提交表单或执行操作。
  2. 滚动事件监听(scroll):限制滚动处理函数的调用频率,减少性能开销。
  3. 鼠标移动事件(mousemove):减少事件处理函数的执行次数,避免界面卡顿。

优点

  • 提升性能:减少不必要的计算和网络请求,降低浏览器的工作负担。
  • 改善体验:使用户界面更加流畅,响应更加及时。
  • 资源节约:减少服务器资源的消耗,优化带宽使用。

实现原理与代码示例

防抖(Debouncing)

原理:设置一个延时器,每次事件触发时重置此延时器。只有当事件停止触发一段时间后,延时器的回调函数才会执行。

代码示例

html 复制代码
<body>
    <input type="text">
</body>
<script>
    let input = document.querySelector('input');
    let timer; // 存储定时器的id
    input.addEventListener('input', () => {
        // 如果定时器存在,清除定时器
        if (timer) {
            clearTimeout(timer);
        }
        // 刷新等待时间
        timer = setTimeout(() => {
            console.log('防抖');
        },1000);
    });
</script>

节流(Throttling)

原理:确保函数在指定时间间隔内最多只执行一次。如果在间隔内触发,那么只有第一次生效,直到下一个时间间隔开始。

代码示例

html 复制代码
<body>
    <input type="text">
</body>
<script>
    let input = document.querySelector('input');
    let timer = null; // 存储定时器的id
    input.addEventListener('input', () => {
        // 判断是否还在时间间隔内,如果在,则直接返回
        if (timer != null) {
            return
        }
        timer = setTimeout(() => {
            console.log('节流');
            timer = null; // 执行结束时清除定时器,以便下次可以触发
        },1000);
    });
</script>
相关推荐
snpgroupcn13 分钟前
SAP实施风险管控注意事项:四大风险域与防范策略
前端·数据库·人工智能
阿成学长_Cain36 分钟前
Linux talk 命令详解:经典终端实时聊天工具,无需图形界面即可对话
linux·运维·前端
lichenyang4531 小时前
从零开始写 HarmonyOS Web 容器:先让 ArkWeb 加载本地 H5
前端
kyriewen1 小时前
一个看不见的撇号,让Claude Code追踪了中国开发者三个月
前端·ai编程·claude
莫生灬灬1 小时前
DY联系人聊天Web面板支持获取联系人/聊天记录/发送消息
前端·chrome·websocket·c#
郑州光合科技余经理1 小时前
海外外卖平台源码改造实战——多语言核心代码实现
java·开发语言·前端·后端·mysql·架构·php
一tiao咸鱼1 小时前
前端转 agent # 02 - FastAPI 框架入门与原理
前端·python
wanghowie2 小时前
LangGraph4j 落地(二)— ReAct 多步工具与 trace 扩展
前端·react.js·前端框架
大家的林语冰2 小时前
Rust 再次打败 Go,Astro 7 首发,什么叫“万物皆可锈化“!
前端·javascript·性能优化
lichenyang4532 小时前
H5 如何调用 ArkTS:JavaScriptProxy、requestId 和 Promise 回调
前端