防抖和节流

news2024/12/23 11:23:08

使用场景:

防抖在连续的事件,只需触发一次回调的场景有:

搜索框搜索输入。只需用户最后一次输入完,再发送请求。
窗口大小resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。
登录、发短信等按钮避免用户点击太快,以致于发送了多次请求,需要防抖。
节流在间隔一段时间执行一次回调的场景有:

滚动加载,加载更多或滚到底部监听
搜索框,搜索联想功能

一:函数防抖:

概念当调用动作过n秒后,才会执行该动作,若在这n秒内又调用此动作则将重新计算执行时间(一定时间内,只会执行最后一次任务)

例如:王者荣耀中的英雄回城,点击回城后将在五秒后回城,如果在这五秒内我们再次点击回城就会打断上一次的回城重新执行一个新的回城任务要重新等待五秒才能回城 (被打断就重新执行)

实现方式:每次触发事件时设置一个延迟调用方法,并且取消之前的延时调用方法

思路:

1.事件函数执行, 先创建个定时器

2.把逻辑代码放到定时器中

3.当函数再次触发, 清除定时器

4.创建一个新定时器即可

例如: 

  <body>
    <button>点我防抖</button>
    <script>
      let button = document.querySelector("button");
      let timeout = null; //创建一个标记用来存放定时器的返回值
      button.onclick = function () {
        if (timeout) clearTimeout(timeout);//每当用户输入的时候把前一个setTimeout清理掉
        timeout = setTimeout(()=> {  //创建一个新的 setTimeout
          console.log("防抖");
        }, 1000);
      };
    </script>
  </body>

效果:

为了方便使用,把他封装成防抖函数:

  <body>
    <button>点我防抖</button>
    <script>
      let button = document.querySelector("button");
      button.onclick = debounce(function () {  //点击事件触发防抖函数
        console.log(this);
      }, 1000);
      封装的防抖函数:
      function debounce(fn, delay) {
        let timeout = null;
        return function () {      //真正的事件处理函数,this:事件的触发者
          if (timeout) clearTimeout(timeout);
          timeout = setTimeout(() => {
            fn.call(this);       //改变this指向
          }, delay);
        };
      }
    </script>
  </body>

效果:

 二:函数节流:

概念:每次触发事件时,如果当前有等待执行的延时函数,则直接return(指定时间间隔内只会执行一次任务。)

例如:王者荣耀英雄的技能CD,指定时间内只能用一次,多次点击无效果

 实现思路:

1. 事件函数执行, 先判断有无定时器, 忧则直接return

2. 没有就把逻辑代码放到定时器

3. 定时器执行后, 置空定时器变量

4. 下次事件函数执行时, 创建一个新定时器即可

例如: 

  <body>
    <button>点我</button>
    <script>
      let button = document.querySelector("button");
      let timeout = null;
      button.onclick = function () {
        if (timeout) return;
        timeout = setTimeout(function () {
          console.log("节流");
          timeout = null;
        }, 1000);
      };
    </script>
  </body>

 效果(不管点多快都是一秒输出一次):

 为了方便使用,把他封装成防抖函数:

<body>
    <button>点我节流</button>
    <script>
      let button = document.querySelector("button");
      let timeout = null;
      //点击事件触发节流函数
      button.onclick = throttle(function () {
        console.log("节流");
      }, 1000);
      //封装公共节流函数:
      function throttle(fn, delay) {
        return function () {
          //真正的事件处理函数 this:事件的触发者
          if (timeout) return;
          timeout = setTimeout(()=> {
            fn.call(this);
            timeout = null; //置空,让事件再次触发时,重新创建一个定时器
          }, delay);
        };
      }
    </script>
  </body>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生周刊 | 美国国防部发布零信任战略与路线图

美国国防部发布了到 2027 年截止的零信任战略与路线图&#xff0c;总共有 45 项能力&#xff0c;最终目标是“安全的国防部信息企业”。 开源项目推荐 Extism Extism 是一个 WebAssembly 插件实现框架&#xff0c;它可以给你的应用开发出各种各样的 WebAssembly 插件&#xf…

HTML网页设计——轮滑运动体育类人物介绍主题12页面毕业设计网页

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

[附源码]JAVA毕业设计商店管理系统(系统+LW)

[附源码]JAVA毕业设计商店管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

电池供电遥测终端RTU 遥测终端机 低功耗遥测采集终端 智能远传 防水IP68

平升电子电池供电遥测终端RTU/遥测终端机/低功耗遥测采集终端是基于4G、5G、NB-IoT网络实现数据采集、远程传输、分析计算、越限报警的智能设备&#xff0c;具有功耗低、IP68防水等特点。特别适合用在无供电条件、防水防尘要求高的监测现场。 随着通信网络更迭、产品持续改进&…

在线文档协同办公-开箱即用demo

在线文档协同办公-开箱即用demo服务安装&#xff08;略&#xff09;下面开始集成打开文件保存文件共同编辑展示一下集成后的效果图服务安装&#xff08;略&#xff09; 这里可以参考前几篇博客内容 Linux版 windows版 下面开始集成 打开文件 1.创建一个空的html文件。 添加…

python匿名函数和高阶函数总结

bilibili 千峰python 学习笔记 匿名函数 lambda函数的语法只包含一个语句&#xff0c;如下&#xff1a; lambda 参数列表: 运算表达式Lambda函数能接收任何数量的参数但只能返回一个表达式的值匿名函数可以执行任意表达式(甚至print函数)&#xff0c;但是一般认为表达式应该有…

UDP-B-L-阿拉伯糖二钠盐,UDP-b-L-arabinopyranose disodium salt,15839-78-8

产品名称&#xff1a;UDP-B-L-阿拉伯糖二钠盐 英文名称&#xff1a;UDP-b-L-arabinopyranose disodium salt CAS号&#xff1a;15839-78-8 分子式&#xff1a;C14H22N2O16P2 分子量&#xff1a;536.27600 产地&#xff1a;西安 规格&#xff1a;1mg 5mg 10mg 纯度&#xff1…

西门子CT重建算法

相对于MR&#xff0c;CT在参数及扫描方面并不是太难&#xff0c;但是CT的图像重建及各种算法则是非常难的&#xff0c;也是比较抽象的。这篇文章介绍CT图像重建算法等相关内容。 CT技术是CT诊断的基础&#xff0c;帮助医务工作者充分掌握CT技术是我们的责任和义务&#xff01; …

Redis原理 - 对象的数据结构(SDS、Inset、Dict、ZipList、QuickList、SkipList、RedisObject)

Redis数据结构 1. SDS Redis 是用 C 语言写的&#xff0c;但是对于 Redis 的字符串&#xff0c;却不是 C 语言中的字符串&#xff08;即以空字符’\0’结尾的字符数组&#xff09;&#xff0c;它是自己构建了一种名为 简单动态字符串&#xff08;simple dynamic string,SDS&am…

如何在ios成功上架android tv?​

如果你是新手&#xff0c;将在这里清晰发布到App Store整个上架流程&#xff0c;还有相应的流程解决方案。​ 如果你上架过iOS APP&#xff0c;这里会了解到有更快捷的上架过程。​ 上架iOS最基本需要一个付费的开发者账号&#xff0c;还没有的话申请一个或者借用。​ 通常也…

7.springboot中整合Jpa多数据源

Springboot 整合spring data jpa多数据源 在使用Mybatis时会涉及多数据源的问题&#xff0c;同样&#xff0c;当我们使用Jpa作为持久化处理方式时&#xff0c;也会涉及多数据源的问题&#xff0c;本节我们来讲解一下Springboot如何整合Spring data Jpa多数据源。 1.创建项目 …

ARM基础(1):Cortex-M3的核心寄存器和特殊寄存器

Cortex-M3处理器的寄存器包括R0~R15和一些特殊的寄存器。其中R0到R12是通用寄存器&#xff0c;但是一些16位的Thumb指令只能访问R0到R7(低寄存器)&#xff0c;而32位的Thumb-2指令则可以访问所有这些寄存器。特殊寄存器只能通过特殊访问指令访问。 文章目录1 核心寄存器1.1 R13…

牛客网刷题【BC33、BC56、BC44、BC91、BC49、写函数求最大值】

目录 一、BC33 计算平均成绩 二、BC56 线段图案 三、BC44 判断整数奇偶型 四、BC91 成绩输入输出问题 五、BC49 判断两个数的大小关系 六、写函数&#xff0c;求最大值 一、BC33 计算平均成绩 #include <stdio.h>int main() {double score0;double sum0;int i…

VK1088B 22*4点 LCD液晶显示屏驱动IC,4*4MM超小体积,具省电模式,多用于超小型LCD段码屏显示驱动,FAE技术支持

产品品牌&#xff1a;永嘉微电/VINKA 产品型号&#xff1a;VK1088B 封装形式&#xff1a;QFN32&#xff08;4MM*4MM&#xff09; 概述&#xff1a; VK1088B是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大88点&#xff08;22SEGx4COM&#xff09;的LCD屏&#xff0c;也…

osgEarth示例分析——osgearth_featurequery

前言 osgearth_featurequery示例&#xff0c;分析了如何拾取地球上的特征&#xff0c;并对特征信息进行提取与显示。 执行命令&#xff1a;osgearth_featurequeryd.exe earth_image\china-simple.earth 需要注意的是&#xff1a;earth文件&#xff0c;必须有特征内容。否则无…

tkinter制做一个音乐下载小软件,多种音乐免费听

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 平常我们下载的歌曲&#xff0c;都是各种妖魔鬼怪的格式横行~ 想下载下来用一下都不行&#xff0c;还只能在它的播放器内听&#xff0c;这谁受得了~ 学Python是用来干嘛的&#xff1f; 当然是解…

929903-87-7,Ac-Arg-Leu-Arg-MCA

Ac-RLR-AMC, fluorogenic substrate for assaying the trypsin-like activity of purified proteasomes (Km 78 μM). Ac-RLR-AMC&#xff0c;荧光底物&#xff0c;用于测定纯化蛋白酶体的胰蛋白酶样活性(Km 78 μM)。 多肽荧光标记由于没有放射性&#xff0c;实验操作简单。…

高通平台开发系列讲解(AI篇)如何让MTCNN运行在SNPE

文章目录 一、使用到的工具二、环境配置2.1、Snpe的环境配置2.2、opencv的环境配置2.3、caffe的环境配置三、MTCNN网络组成四、基于SNPE运行MTCNN沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要介绍如何使用高通平台SNPE运行MTCNN。 一、使用到的工具 Ubunt…

MNN简介

一、轻量级高性能推理引擎 1.简介 MNN 是一个高效、轻量的深度学习框架。它支持深度模型推理与训练&#xff0c;尤其在端侧的推理与训练性能在业界处于领先地位。目前&#xff0c;MNN 已经在阿里巴巴的手机淘宝、手机天猫、优酷、钉钉、闲鱼等 20 多个 App 中使用&#xff0…

Vue/JS中定时器模拟随机指定范围、位数的小数并更新innerHTML以及页面被销毁时监听事件中销毁定时器

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_霸道流氓气质的博客-CSDN博客_前后端分离项目本地运行 Vue页面上某个弹窗内容是innerHTML动态拼接。 系统演示时需构造模拟数据&#xff0c;模拟出数…