首页 > 其他分享 >前端性能优化---防抖与节流--02

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

时间:2024-08-03 11:31:50浏览次数:6  
标签:02 防抖 const 节流 -- args context func

防抖(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);

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

 

标签:02,防抖,const,节流,--,args,context,func
From: https://www.cnblogs.com/zx618/p/18340223

相关文章

  • joisc2017 D3T1 长途巴士 题解
    joisc2017D3T1长途巴士题解这是学校ACM欢乐赛的题,赛时想到做法了,但是因为我各种唐诗没写出来翻了转化题面我们发现,只可以踢掉检查站前面一个连续段的接水人,并且不能踢掉司机,考虑画出对整个路程表示的线段上图几个小点是检查点,考虑在每个检查点之前踢掉一段的人,容易发......
  • 振动传感器
    2.1型号介绍 有很多种型号的震动模块,801S、SW-520D、SW-420、SW-18010P等等,它们之间大同小异。   SW-18010P,模块介绍如下。   接好VCC和GND,电源指示灯将被点亮。 当检测到震动时,板载指示灯点亮;震动停止,板载指示灯熄灭。 用螺丝刀转动「灵敏度调......
  • 域名申请与备案流程
    1.域名申请流程(阿里云为例)1.1注册并登录阿里云账户 如果你没有阿里云账号,首先需要注册一个。访问阿里云官网,点击“免费注册”。 按照提示填写相关信息,完成账号注册。1.2登录阿里云账户: 注册完成后,使用你的账户信息登录阿里云官网。1.3进入域名注......
  • 1. 阿里云服务器申请流程
     1.云服务器需求 选择云服务提供商(如阿里云、腾讯云、AWS等) 创建云服务器实例 配置服务器(操作系统、网络、安全组) 完成购买,获取服务器IP地址和登录信息。 安全措施:配置防火墙、使用SSL/TLS、每日自动备份和异地备份。 前期可以......
  • 开通阿里云短信服务
    步骤1:注册和登录阿里云1.访问阿里云官网。2.如果你还没有阿里云账户,点击注册并完成账户注册流程。3.使用你的账户登录阿里云控制台。步骤2:开通短信服务4.在控制台首页,搜索“短信服务”并进入短信服务页面。5.点击“立即开通”按钮,按照提示完......
  • 开通微信支付流程
    1.注册微信支付商户账号访问微信支付商户平台:前往微信支付商户平台。注册账户:根据提示注册微信支付商户号,填写相关信息并提交审核。2.配置开发环境登录微信支付商户平台:使用商户号和密码登录微信支付商户平台。获取商户号和密钥:在左侧菜单中选择「账户中心」-「账户设置」-「......
  • 类型转换
    1.类型转换优先级如图所示2.转换方法强制转换自动转换3.转换问题1.内存溢出:在大容量转换为小容量时,如果容量过大而超过了小容量的类所能承受的范围,则会出错。如:2.精确问题:在小数转整数时,会出现误差如:3.相乘问题:未转换,已相乘。如:解决方法:......
  • 前端性能优化措施---服务器优化--03
    前端性能优化不仅限于客户端的代码优化,还涉及到服务器端的优化。服务器优化对提升网站性能、减少延迟、提高用户体验至关重要。服务器优化技术,包括减少HTTP请求、使用缓存策略、内容压缩、CDN加速、服务器端渲染(SSR)、优化数据库查询等。1.减少HTTP请求每次HTTP请求都会......
  • 第六章 死锁
    第六章死锁6.1资源资源就是随着时间的推移,必须能获得、使用以及释放的任何东西。6.1.1可抢占资源和不可抢占资源资源分为两类:可抢占的和不可抢占的。可抢占资源(preemptableresource)可以从拥有它的进程中抢占而不会产生任何副作用,存储器就是一类可抢占的资源。......
  • fNIRS实验设计注意内容
    经典实验设计事件相关设计(event-related,ER)和组块设计(block)是最为经典的实验设计。其中ER设计又可以分为慢速ER设计与快速ER设计。ER和Block设计各有优劣,且两者在基于血液响应函数的研究设备的实验中应用有所不同。两类实验设计差异检测能力和估计能力在众多教材中都有所涉及的......