谈谈前端开发中的防抖和节流

本文作者为 360 奇舞团前端开发工程师 李武阳

概述

防抖节流是前端开发中常用的函数优化手段,它们可以限制函数的执行频率,提升性能和用户体验。主要用于处理高频触发的事件,例如:用户的滚动、输入、点击和表单的重复提交等。

防抖与节流的区别

先简单描述下它们的作用

防抖:如果一个函数持续地、频繁地触发,那么只在它结束后过一段时间才开始执行。换句话说,如果你持续触发事件,那么防抖函数将不会执行,只有当你停止触发事件后,它才会在指定的延迟时间后执行。这对于防止例如用户在输入框中连续输入时发送过多的Ajax请求等情况非常有用。

节流:如果你持续触发事件,每隔一段时间,事件处理函数只执行一次。这有助于限制一些处理函数的执行频率,例如:滚动事件、窗口大小调整事件等。

简而言之,防抖是在事件停止触发后延迟执行函数,而节流是按照固定的时间间隔执行函数。

因为防抖节流的作用和应用场景基本相同,也就导致它们容易被混淆。

防抖的实现与使用

防抖的应用场景:

  1. 输入框搜索:当用户在搜索框中输入关键字时,使用防抖可以避免频繁发送搜索请求,而是在用户停止输入一段时间后才发送请求,减轻服务器压力。
  2. 按钮点击:当用户点击按钮时,使用防抖可以避免用户多次点击造成的多次提交或重复操作。

实现防抖的基本方式是利用定时器,每次触发事件时都清除上一次的定时器,然后重新设置一个新的定时器。

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <button id="btn">按钮</button>
    <script>
       
        // 防抖函数  
        function debounce(func, wait) {  
            let timeout;  
            return function (...args) {  
                const context = this;  
                clearTimeout(timeout);  
                timeout = setTimeout(() => func.apply(context, args), wait);  
            };  
        }  

        // 使用防抖函数控制连续触发事件的处理函数执行频率  
        const debouncedHandler = debounce(() => {  
            console.log('Debounced event triggered');  
        }, 500);  

        document.getElementById('btn').addEventListener('click',debouncedHandler)
    </script>
</body>

</html>

节流的实现与使用

节流的应用场景:

  1. 页面滚动:当页面滚动时,使用节流可以限制滚动事件的触发频率,减少事件处理的次数,提高页面的响应性能。
  2. 按钮点击:当用户点击按钮时,使用节流可以减少事件处理的次数,避免过于频繁的操作。

实现节流的方式也是利用定时器,但与防抖不同的是,节流会保证在一个固定的时间间隔内至少执行一次事件处理函数。

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <button id="btn">按钮</button>
    <script>
       
       // 节流函数  
        function throttle(func, limit) {  
            let inThrottle;  
            return function (...args) {  
                const context = this;  
                if (!inThrottle) {  
                func.apply(context, args);  
                inThrottle = true;  
                setTimeout(() => inThrottle = false, limit);  
                }  
            };  
        }

        // 使用节流函数控制连续触发事件的处理函数执行频率  
        const throttledHandler = throttle(() => {  
            console.log('Throttled event triggered');  
        }, 1000);

        document.getElementById('btn').addEventListener('click',throttledHandler)
    </script>
</body>

</html>

总结

在实际的前端开发中,防抖和节流的使用场景非常广泛。例如:搜索框的实时搜索建议可以使用防抖来减少服务器请求;滚动加载更多数据可以使用节流来防止在短时间内发送过多的请求。通过使用这两种技术,我们可以有效地优化前端的性能,提升用户体验。

相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁2 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95272 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大2 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师2 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学2 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端