首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

前端性能优化---防抖与节流--02

编程知识
2024年08月03日 10:23

防抖(Debounce)和节流(Throttle)是两种常用的优化技术,主要用于控制高频率的事件触发,如滚动、输入、窗口调整大小等。本文将深入探讨防抖与节流的原理、实现方法及其应用场景。

简单场景就是:输入框防抖,滚动节流

 

1. 防抖(Debounce)

防抖是一种在事件频繁触发时,通过延迟执行来减少事件触发次数的技术。防抖的核心思想是:当事件被触发时,不立即执行处理函数,而是设置一个定时器,如果在定时器未结束前再次触发事件,则重新开始计时。这样可以确保在一定时间内只执行一次事件处理函数。

实现原理:

function debounce(func, wait) {
    let timeout;
    return function(...args) {
        const context = this;
        clearTimeout(timeout);
        timeout = setTimeout(() => func.apply(context, args), wait);
    };
}

 

示例应用:

在搜索框输入时,实时发送请求获取搜索建议。如果不进行防抖处理,每次输入都会发送请求,造成服务器压力和资源浪费。通过防抖可以优化这种场景:

const searchInput = document.getElementById('search');
const handleSearch = debounce((event) => {
    console.log('Fetching search results for:', event.target.value);
    // 发送搜索请求
}, 300);

searchInput.addEventListener('input', handleSearch);

 

2. 节流(Throttle)

节流是一种在事件频繁触发时,通过限制函数执行频率来减少事件处理次数的技术。节流的核心思想是:在规定的时间间隔内只执行一次事件处理函数,不论期间事件触发了多少次。

实现原理:

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 handleScroll = throttle(() => {
    console.log('Scroll position:', window.scrollY);
    // 处理滚动事件
}, 200);

window.addEventListener('scroll', handleScroll);

 

3. 防抖与节流的选择

防抖和节流虽然都是用于控制高频事件,但它们的应用场景有所不同:

  • 防抖:适用于频繁触发但只需最后一次结果的场景,如搜索输入、窗口大小调整等。
  • 节流:适用于持续触发但需要定期执行的场景,如滚动事件、窗口滚动位置计算等。

4. 深入优化

立即执行版防抖:

有时我们希望在事件触发时立即执行一次,然后再进行防抖控制,可以在防抖函数中添加一个立即执行选项:

function debounce(func, wait, immediate) {
    let timeout;
    return function(...args) {
        const context = this;
        const callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(() => {
            timeout = null;
            if (!immediate) func.apply(context, args);
        }, wait);
        if (callNow) func.apply(context, args);
    };
}

 

带有标识的节流:

有时我们希望在节流过程中能够获取到当前的状态,可以在节流函数中添加一个标识:

function throttle(func, limit) {
    let inThrottle;
    return function(...args) {
        const context = this;
        if (!inThrottle) {
            func.apply(context, args);
            inThrottle = true;
            setTimeout(() => inThrottle = false, limit);
        }
    };
}

 

5. 综合应用

在实际开发中,防抖与节流可以结合使用。例如在一个实时搜索的页面中,用户输入时进行防抖处理,而在结果展示时进行节流处理,以优化整体性能。

 

const searchInput = document.getElementById('search');
const resultsContainer = document.getElementById('results');

const fetchResults = debounce((query) => {
    console.log('Fetching results for:', query);
    // 模拟搜索请求
    setTimeout(() => {
        resultsContainer.innerHTML = `Results for: ${query}`;
    }, 500);
}, 300);

const handleScroll = throttle(() => {
    console.log('Scroll position:', window.scrollY);
    // 处理滚动事件
}, 200);

searchInput.addEventListener('input', (event) => {
    fetchResults(event.target.value);
});

window.addEventListener('scroll', handleScroll);

防抖与节流是前端性能优化中的两项重要技术,通过合理地应用这两种技术,可以显著减少高频事件带来的性能问题,提升用户体验。其他性能优化技术,如代码分割、异步加载、懒加载等,后续介绍。

 

From:https://www.cnblogs.com/zx618/p/18340223
本文地址: http://www.shuzixingkong.net/article/741
0评论
提交 加载更多评论
其他文章 LogCat连接安卓手机拉取日志到本地(Unity开发版)
unity开发游戏的时候经常会碰到安卓手机真机报错/崩溃,定位问题需要拉取安卓手机上的日志到电脑上来查看。 1. unity安装的时候,勾选安卓模块(sdk这些记得勾选安装) 2. 打开对应安卓模块个目录下的adb目录, 当前我的安装目录为C:\Program Files\Unity\Hub\Edi
LogCat连接安卓手机拉取日志到本地(Unity开发版) LogCat连接安卓手机拉取日志到本地(Unity开发版) LogCat连接安卓手机拉取日志到本地(Unity开发版)
P6764 [APIO2020] 粉刷墙壁
讲解 P6764 [APIO2020] 粉刷墙壁。 使用动态规划算法,通过题目的特殊性质入手,快速转移,然后是贪心的最小区间覆盖问题。
python3解析wav文件获取dtmf值
操作系统 :Windows 10_x64 Python版本:3.9.2 从事FreeSwitch相关工作,大概率会遇得到DTMF,DTMF的传递方式有三种: In-band RFC2833 SIP-INFO 使用RFC2833或SIP-INFO传递方式的DTMF,FreeSwitch可以在日志中打印
python3解析wav文件获取dtmf值 python3解析wav文件获取dtmf值 python3解析wav文件获取dtmf值
技术资产建设
企业里的研发部门、技术团队其实更多的是软件/互联网公司的生产部门,好比实体产业的生产车间。生产车间可以通过更新车床、设备来提高生产力,这里的车床、设备即是“资产”,那么研发部门的“资产”类比一下就出来了,就是部门级的技术标准、工具。 对于团队人效来说,统一的技术库、技术组件能够形成有效的技术隔离带,
技术资产建设 技术资产建设 技术资产建设
ComfyUI插件:ComfyUI layer style 节点(三)
前言: 学习ComfyUI是一场持久战,而ComfyUI layer style 是一组专为图片设计制作且集成了Photoshop功能的强大节点。该节点几乎将PhotoShop的全部功能迁移到ComfyUI,诸如提供仿照Adobe Photoshop的图层样式、提供调整颜色功能(亮度、饱和度、对比度
ComfyUI插件:ComfyUI layer style 节点(三) ComfyUI插件:ComfyUI layer style 节点(三) ComfyUI插件:ComfyUI layer style 节点(三)
参加阿里云X优酷AI江湖创作大赛,赠送博客园T恤
8月刚开始就接到一个阿里云的广告单子,也是 CPA(Cost Per Action) 方式,按有效参赛人数付费,KPI是完成500人参赛。参赛方式是基于阿里云函数计算服务部署的AI绘画平台创作图片作品,参赛者基于网剧《少年白马醉春风》的故事内容、人物角色、场景或以“少年江湖”为精神内核进行自由创作
参加阿里云X优酷AI江湖创作大赛,赠送博客园T恤 参加阿里云X优酷AI江湖创作大赛,赠送博客园T恤 参加阿里云X优酷AI江湖创作大赛,赠送博客园T恤
前端RSA密钥生成和加解密——window.crypto使用相关
转自简书,原文地址,本文介绍window.crypto关于RSA方面的API。 crypto API支持常用的rsa、aes加解密,这边介绍rsa的应用。 浏览器兼容性 window.crypto需要chrome 37版本,ie 11,safari 11才支持全部API而基本的加解密在safari
SourceGenerator 生成db to class代码优化结果记录 二
优化 在上一篇留下的 Dapper AOT 还有什么特别优化点的问题 在仔细阅读生成代码和源码之后,终于得到了答案 个人之前一直以为 Dapper AOT 只用了迭代器去实现,所以理应差不多实现代码却又极大差距,思维陷入了僵局,一度以为有什么黑魔法 结果 Dapper AOT 没有用迭代器去实现!!