前端优化 - 防抖和节流

📢 鸿蒙专栏:想学鸿蒙的,冲

📢 C语言专栏:想学C语言的,冲

📢 VUE专栏:想学VUE的,冲这里

📢 CSS专栏:想学CSS的,冲这里

📢 Krpano专栏:想学VUE的,冲这里

🔔 上述专栏,都在不定期持续更新中!!!!!!!!!!!!!

目录

✨ 前言

防抖(debounce)

节流(throttle)

✨ 结语


✨ 前言

        在前端开发中,我们经常需要绑定处理函数到一些频繁触发的事件上,如scroll、resize、input等。如果事件处理函数执行频率过高,会对页面性能产生很大影响。  

防抖(debounce)

        防抖的原理是:触发事件后,延迟一段时间执行处理函数,如果在延迟时间内再次触发事件,会重新开始延时。

防抖可以使用的场景:

  • 输入框实时搜索Suggest
  • 窗口resize时调整样式

示例代码:

function debounce(func, delay) {
  let timer = null;
  return function() {
    clearTimeout(timer);
    timer = setTimeout(() => {
      func(); 
    }, delay);
  }
}

// 输入框搜索uggest
const search = debounce(() => {
  // 获取输入值后请求suggest
}, 500);

input.addEventListener('input', search);

      

防抖的一般实现步骤:

1、创建一个延迟调用方法,使用闭包保存需要执行的函数

function debounce(func, delay) {

  let timeout;

  return function() {
    
    // 保存函数执行上下文和参数,传递给延迟函数
  }

}

2、每次事件触发时,都清除之前的延时调用

function debounce(func, delay) {

  let timeout;

  return function() {
    clearTimeout(timeout);
    
    // 省略
  }

}

3、设置一个新的延时调用

function debounce(func, delay) {

  let timeout;

  return function() {
    clearTimeout(timeout);

    timeout = setTimeout(() => {
      func();
    }, delay);
  }

}

4、考虑附加参数并返回函数调用结果

function debounce(func, delay) {

  return function(...args) {
    clearTimeout(timeout);
    
    timeout = setTimeout(() => {
      return func(...args);
    }, delay);
  }

}

返回一个可以取消延时的函数

function debounce(func, delay) {

  let timeout;

  return function(...args) {
    clearTimeout(timeout);
    
    timeout = setTimeout(() => {
      func(...args);
    }, delay);

    return () => clearTimeout(timeout);
  }

}

        这样就实现了一个功能较完整的防抖函数,在不断调用时只执行最后一次,并可以通过返回的函数取消延迟。

节流(throttle)

        节流的原理是:触发事件一段时间内只执行一次处理函数。

节流可使用的场景:

  • 滚动加载更多内容
  • 限制按钮提交频率

示例代码:

function throttle(func, delay) {
  let prev = 0;
  return function() {
    let now = Date.now();
    if (now - prev > delay) {
      func();
      prev = now;
    }
  }
}

// 滚动加载更多
window.addEventListener('scroll', throttle(() => {
  //请求加载更多数据
}, 500));

 来关于节流函数,我也给出一些更完整和详细的实现思路:

1、创建一个可以保存执行时间和方法的闭包

function throttle(func, delay) {

  let lastTime;

  return function() {

    // 保留函数执行上下文和参数
  }

}

2、每次事件触发,比较当前时间和上次时间

function throttle(func, delay) {

  let lastTime = Date.now();

  return function() {

    let now = Date.now();

    if (now - lastTime > delay) {
      // 函数处理逻辑
    }

  }

}

3、在时间差大于阈值时,执行函数并更新最后时间

function throttle(func, delay) {

  let lastTime = Date.now();

  return function() {

    let now = Date.now();

    if (now - lastTime > delay) {
      func();
      lastTime = now; 
    }

  }

}

4、考虑附加参数并返回函数执行结果

function throttle(func, delay) {
  
  return function(...args) {

    // 时间比较逻辑

    return func(...args);

  }

}

5、返回取消延时的方法

function throttle(func, delay) {

  let timeout;

  // 实现逻辑  

  return () => clearTimeout(timeout); 

}

这样就实现了一个具有基本功能的节流函数,它可以帮助我们限制函数执行频率,避免过快调用。

✨ 结语

防抖和节流都是优化高频率执行事件的技巧。区别在于:

  • 防抖是将多次执行变为最后一次执行
  • 节流是将多次执行变成每隔一段时间执行

根据需要选用合适的方式,可以有效避免页面过渡渲染,提升性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/280169.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

提升爬虫IP时效:解决被封IP的难题

在进行数据采集时,经常会遇到被目标网站封禁IP的情况,这给爬虫系统带来了困扰。本文将介绍如何提升爬虫IP的时效,解决被封IP的难题,帮助您顺利进行数据采集,不再受限于IP封禁。 第一步:使用爬虫IP 使用爬虫…

【MySQL】数据库之存储过程(“SQL语句的脚本“)

目录 一、什么是存储过程? 二、存储过程的作用 三、如何创建、调用、查看、删除、修改存储过程 四、存储过程的参数(输入参数,输出参数,输入输出参数) 第一种:输入参数 第二种:输出参数 …

车牌识别技术,如何用python识别车牌号

目录 一.前言 二.运行环境 三.代码 四.识别效果 五.参考 一.前言 车牌识别技术(License Plate Recognition, LPR)在交通计算机视觉(Computer Vision, CV)领域具有非常重要的研究意义。以下是该技术的一些扩展说明&#xff1…

如何解决msvcp110.dll丢失问题,多种解决方法分享

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“msvcp110.dll丢失”,msvcp110.dll是Microsoft Visual C 2012 Redistributable的一个组件,它提供了许多用于运行程序的函数和类库。当这个文件丢失或损坏时&#xff…

oracle-存储结构

文件包括 控制文件.ctl、数据文件.dbf、日志文件.log这三类放在存储上。 参数文件:空间的划分,进程的选用(.ora) oracle启动的时候需要读一下,数据库启动后,参数文件并不关闭,但即使文件丢了&a…

域用户信息查询

域环境基本知识 本地账户 本地账户 命令行查询本地账户 net user来宾账户默认来宾组: net localgroup Guests 查询guest账号SID wmic group get name,sid | findstr Guestspowershell 查询本地用户和 SID Get-WmiObject -Class Win32_UserAccount -Filter &q…

visual studio + intel Fortran 错误解决

版本:VS2022 intel Fortran 2024.0.2 Package ID: w_oneAPI_2024.0.2.49896 共遇到三个问题。 1.rc.exe not found 2.kernel32.lib 无法打开 3.winres.h 无法打开 我安装时参考的教程:visual studio和intel oneAPI安装与编写fortran程序_visual st…

私有部署ELK,搭建自己的日志中心(六)-- 引入kafka对采集日志进行削峰填谷

一、背景 首先,要说明一点,elk日志中心,是可以缺少kafka组件的。 其次,如果是研发环境下,机器资源紧张的情况下,也是可不部署kafka。 最后,因为kafka的部署是可以独立的,所以本文将…

IP地理位置定位技术基本原理

IP地理位置定位技术的基本原理是基于IP地址的特性。每个IP地址在网络中都有一个与之对应的地理位置信息,这是通过IP地址数据库来确定的。这个数据库由ISP(Internet Service Provider)或其它一些机构维护,其中包含了每个IP地址的地…

凸包算法--物体表面积/体积计算--python版

文章目录 环境:1.1 凸包法介绍:2.1 python代码3.1 可视化4.1 体积/表面积Calculation 环境: Open3D 1.1 凸包法介绍: 用于找到包围给定点集的最小凸多边形或凸多面体 常用的凸包算法: Grabam扫描法(适用…

iptables 防火墙(二)

目录 1. SNAT 策略及应用 1.1 SNAT策略概述 1. 只开启路由转发,未设置地址转换的情况 2. 开启路由转发,并设置SNAT转换的情况 1.2 SNAT策略的应用 1. 2.1 共享固定IP上网 (1)打开网关的路由转发 (2)…

LLaVA-v1.5-7B:实现先进多模态学习的开源AI

引言 LLaVA-v1.5-7B是一个开源大型多模态模型(LMM),它通过结合视觉指令调整(Visual Instruction Tuning)技术,展示了在多模态理解和生成任务上的卓越性能。该模型特别注重简洁性和数据效率,利用…

MySQL:索引

MySQL官方对索引的定义为: 索引 (Index) 是帮助MySQL高效获取数据的数据结构。 提取句子主干,就可以得到索引的本质:索引是数据结构。 1. 什么是索引,索引的作用 索引是一种用于快速查询和检索数据的数据结构,帮助mysql提高查询效率的数据…

在Linux运行LaTeX

共有三个步骤1. 装LaTexTeX Live - TeX Users Group 下载对应版本安装包安装 文件比较大,这步花的时间多一点,不过也不会太多,感觉5分钟十分钟的样子吧 2. 装TexStidio 这一步是安装一个类似在windows系统下的TaTeX GUI软件 图标是这样3. 配置…

安装hadoop

前置需要安装java rz tar -zxvf jdk-8u381-linux-x64.tar.gz -C / ln -s /jdk1.8.0_381/ /jdk # rm jdk-8u381-linux-x64.tar.gzexport JAVA_HOME/jdk export PATH$PATH:$JAVA_HOME/binhadoop可以选择清华源或者官网下载官网 rz # 上传hadoop包到机器 tar -zxvf hadoop-3.3.6…

精致旅游公司Treker网页设计 html模板

一、需求分析 旅游网站通常具有多种功能,以下是一些常见的旅游网站功能: 酒店预订:旅游网站可以提供酒店预订服务,让用户搜索并预订符合其需求和预算的酒店房间。 机票预订:用户可以通过旅游网站搜索、比较和预订机票…

【数据结构】链式家族的成员——循环链表与静态链表

循环链表与静态链表 导言一、循环链表1.1 循环单链表1.2 循环双链表 二、静态链表2.1 静态链表的创建2.2 静态链表的初始化2.3 小结 结语 导言 大家好!很高兴又和大家见面啦!!! 经过前面的介绍,相信大家对链式家族的…

企业如何做好内容?媒介盒子分享

在个性化算法的支持下,企业通过创作优质内容使消费者主动选择企业的时代已经来临,对于中小企业来说,这是能够低成本进行营销的好机会。但是有许多企业对内容的理解依旧是片面的,今天媒介盒子就来和大家聊聊:企业如何做…

【MYSQL】-函数

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

《微信小程序开发从入门到实战》学习六十七

6.6 网络API 部分小程序服务端不是用云开发技术实现,而是由开发人员使用后端开发语言实现。 在小程序用网络API与(开发人员使后端开发语言建设的)服务端进行交互,可与服务端交换数据、上传或下载文件。 6.6.1 服务器域名配置 …