防抖 节流 应用

文章介绍了防抖和节流的概念,它们是用于优化JavaScript事件处理的常见技术。防抖函数确保在最后一次触发事件后的一段时间执行,而节流函数则限制在一定时间内只执行一次。文中提供了防抖和节流函数的实现示例,分别应用于点击事件的处理上。

防抖函数

概念

所谓防抖,就是指触发事件 N 秒后才执行函数,如果在 N 秒内又触发了事件,则会重新计算函数执行时间,也就是说,最后一次触发事件后的N秒后执行函数

实现

<button class="debounceButton">防抖事件</button>

<script>
    // 获取防抖事件按钮
    const debounceButton = document.querySelector('.debounceButton');
    // 分装防抖函数
    function debounce (debounceCb, delay = 1000) {
        let timer;
        return (...args) => {
            if (timer) {
                clearTimeout(timer)
            }
            timer = setTimeout(() => {
                debounceCb.apply(this.args)
            }, delay)
        }
    };
    // 调用防抖函数
    debounceButton.addEventListener('click', debounce(e => {
        console.log('防抖事件');
    }))
</script>

节流函数

概念

所谓节流,就是指连续触发事件但是在 N 秒中只执行一次函数,也就是说,在触发事件后,不管你触发了多少次,它都是在每 N 秒执行一次

实现

<button class="throttleButton">节流事件</button>
<srcipt>
    // 获取节流事件按钮
    const throttleButton = document.querySelector('.throttleButton');
    // 封装节流函数
    function debounce (debounceCb, delay = 1000) {
        let timer;
        return (...args) => {
            if (timer) {
                clearTimeout(timer)
            }
            timer = setTimeout(() => {
                debounceCb.apply(this.args)
            }, delay)
        }
    };
    // 调用节流函数
    throttleButton.addEventListener('click', throttle(e => {
        console.log('节流事件')
    }))
</srcipt>

<think>嗯,用户想了解防抖节流在实际开发中的应用案例。首先,我需要回忆一下防抖节流的基本概念。防抖是让函数在连续触发后只执行一次,而节流是让函数在一定时间间隔内只执行一次。然后,根据之前的引用资料,引用1提到防抖节流用于控制函数执行频率,提高性能和用户体验。引用2和3给出了具体的代码实现和一些应用场景,比如输入框输入和滚动事件。 接下来,我应该整理常见的应用场景。比如搜索框输入,用户连续输入时,使用防抖可以减少请求次数,避免频繁向服务器发送请求。再比如窗口调整,防抖可以等用户调整完窗口大小后再执行计算。按钮提交防止重复点击也是防抖的典型应用。 对于节流,滚动加载更多内容是一个常见例子,比如无限滚动页面,每隔一定时间检查位置,而不是每次滚动都触发。鼠标移动的高频事件,比如拖拽,用节流可以限制执行频率。还有游戏中的按键处理,防止技能连发。 然后需要考虑用户可能的实际开发场景,结合引用中的代码示例,比如引用2中的节流函数用时间戳实现,引用3中的lodash工具库使用。需要将这些例子具体化,让用户容易理解。 还要注意区分防抖节流的适用情况。防抖适合等待操作停止后再执行,而节流是定期执行。比如实时搜索用防抖,滚动加载用节流。这样用户能根据需求选择合适的方案。 最后,检查是否有遗漏的应用场景,比如防抖在自动保存中的应用,或者节流在动画帧中的应用。确保覆盖常见的案例,并引用相关资料中的信息,比如引用1提到的应用场景,引用2中的函数实现,引用3的工具库使用,来增强回答的可信度。</think>### 防抖节流的实际应用场景分析 #### 一、防抖(Debouncing) 防抖的核心是**延迟执行**,在连续触发事件时,仅当事件停止触发后超过设定时间才会执行最后一次操作。 **典型应用场景**: 1. **搜索框输入联想** 用户连续输入时,延迟发送请求,避免频繁触发接口调用。例如输入停止$500ms$后再发起搜索请求[^1]。 ```javascript inputEl.addEventListener('input', debounce(function() { fetchSearchData(this.value); }, 500)); ``` 2. **窗口大小调整监听** 窗口拖动过程中不立即计算布局,等待调整结束后再触发一次计算[^2]。 ```javascript window.addEventListener('resize', debounce(calculateLayout, 300)); ``` 3. **按钮重复点击拦截** 防止用户快速点击提交按钮导致多次提交表单,例如支付场景[^3]。 ```javascript submitBtn.addEventListener('click', debounce(handlePayment, 1000)); ``` --- #### 二、节流(Throttling) 节流的本质是**固定频率执行**,无论事件触发多频繁,始终按固定时间间隔执行操作。 **典型应用场景**: 1. **滚动加载更多内容** 滚动过程中每隔$200ms$检查一次滚动位置,避免高频计算。 ```javascript window.addEventListener('scroll', throttle(checkScrollPosition, 200)); ``` 2. **鼠标移动轨迹记录** 高频事件如鼠标拖拽元素时,限制位置更新频率为每秒$60$帧[^3]。 ```javascript draggableEl.addEventListener('mousemove', throttle(updatePosition, 16)); ``` 3. **游戏技能冷却控制** 限制玩家连续按键触发技能的频率,例如每$1.5s$允许释放一次技能。 ```javascript attackBtn.addEventListener('click', throttle(castSkill, 1500)); ``` --- #### 三、选择策略对比 | 场景特征 | 适用方案 | 示例 | |----------------------|----------|-----------------------| | **需等待操作结束** | 防抖 | 搜索框输入联想 | | **需保持周期反馈** | 节流 | 滚动加载/动画渲染 | | **高频但需均匀执行** | 节流 | 鼠标移动/窗口滚动事件 | --- ### 代码实现参考 防抖基础实现: ```javascript function debounce(fn, delay) { let timer = null; return (...args) => { clearTimeout(timer); timer = setTimeout(() => fn.apply(this, args), delay); }; } ``` 节流时间戳版(引用自[^2]): ```javascript function throttle(fn, delay = 500) { let prev = Date.now(); return (...args) => { if (Date.now() - prev >= delay) { fn.apply(this, args); prev = Date.now(); } }; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热乎劲的小仓库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值