防抖函数,定时的清除

news2024/11/20 8:46:37

什么是防抖函数

在某一个时间段内,一个函数频繁快速的调用,只执行最后一次的调用。

防抖函数实际应用场景

我们在执行一个数据搜索功能时,通过监听input框的值,值变化触发搜索,

如果我们在输入框输入"zhangsan",因为值变化了八次,会触发八次搜索,但是,我们只需要在输入完成后触发一次搜索就行。

防抖函数的基本思路

为了不让函数频繁的触发,就需要给搜索方法添加一个定时(也可以说延时),当我们输入"z"时给搜索方法添加延时1000ms(1s),函数处于等待状态1秒后执行,紧接着1秒之内我们输入了"h",清除原有的定时重新计算时间,直到输入最后一个字符,再1秒执行搜索。

实现防抖函数之前先介绍一下定时器

什么是定时器

全局的 setTimeout() 方法设置一个定时器,一旦定时器到期,就会执行一个函数或指定的代码片段。

定时器的使用

setTimeout(() => {
  console.log("延迟了 1 秒");
}, 1000);

和异步函数的配合

setTimeout() 是异步函数,意味着计时器函数将不会暂停函数栈中其他函数的执行。也就是说,你不能使用 setTimeout() 来在函数栈中下一个函数执行前执行“暂停”操作。

查看以下示例:

setTimeout(() => {
  console.log("这是第一条消息");
}, 5000);
setTimeout(() => {
  console.log("这是第二条消息");
}, 3000);
setTimeout(() => {
  console.log("这是第三条消息");
}, 1000);

// 输出:

// 这是第三条消息
// 这是第二条消息
// 这是第一条消息

请注意,第一个函数在调用第二个函数之前没有建立一个 5 秒钟的“暂停”。相反,第一个函数被调用,但等待 5 秒后执行。当第一个函数等待执行时,第二个函数被调用,在第二个函数执行之前,对其进行了 3 秒的等待。由于第一个和第二个函数的定时器都没有完成,第三个函数被调用并首先完成其执行。第二个函数紧随其后。在第一个函数的定时器最终完成后,最后执行该函数。 

返回值

返回值 timeoutID 是一个正整数,表示由 setTimeout() 调用创建的定时器的编号。这个值可以传递给 clearTimeout() 来取消该定时器。

 输出

取消定时

正确的取消定时

clearTimeout(timer)

let timer = setTimeout(() => {
    console.log("1s后执行");
    console.log("timer=",timer);
},1000)
clearTimeout(timer)

不正确的取消定时

不正确的取消定时(一)

let timer = setTimeout(() => {
    console.log("1s后执行");
    console.log("timer=",timer);
},1000)
timer = null

不正确的取消定时(二)

let timer = setTimeout(() => {
    timer = null
    console.log("1s后执行");
    console.log("timer=",timer);
},1000)

不正确取消定时(三)

let timer = setTimeout(() => {
    clearTimeout(timer)
    console.log("1s后执行");
    console.log("timer=",timer);
},1000)

为什么timer=null不能取消定时

setTimeout函数的返回值是一串数字,取消定时的原理是根据这一串数字找到对应的定时任务然后再清楚定时。

timer=null只是可以让浏览期垃圾回收这个变量而已,并不会调用清除(clearTimeOut)方法去清楚定时

防抖函数的实现

<!DOCTYPE html>
<html lang="CH-EN">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>防抖函数</title>
  </head>
  <body>
    <div class="content">
      <input name="value" style="width: 200px" />
      <button onclick="btnclick()">btnclick</button>
    </div>
  </body>
</html>

<script>
  // 使用防抖函数多次点击仅触发一次
  btnclick = debounce(function () {
    console.log("点击了按钮");
  }, 1000);

  const input = document.querySelector("input");
  // input 输入变化的监听
  input.addEventListener(
    "input",
    debounce(function (e) {
      // input值 插入页面中
      insertEle(e.target.value);
      insertEle("触发搜索");
    }, 1000)
  );
  // 防抖函数
  function debounce(fn, delay) {
    // 定义防抖Id  (timer)
    let timer = null;
    return (...args) => {
      if (timer) {
        clearTimeout(timer);
      }
      // 储存定时(setTimeOut)的返回值 ,清除方法根据timer去清楚定时;
      timer = setTimeout(() => {
        // timer=null 便于方法执行完成后垃圾回收
        timer = null;
        fn.apply(this, args);
      }, 1000);
    };
  }
  // input 框中插入新元素
  function insertEle(str) {
    const content = document.querySelector(".content");
    let ele = document.createElement("div");
    ele.innerText = str;
    content.insertBefore(ele, input);
  }
</script>
<style>
  * {
    margin: 0;
    padding: 0;
  }
  body {
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .content {
    height: 300px;
    width: 500px;
    border: solid #ddd 1px;
    text-align: center;
    padding: 20px;
  }
  .content input {
    height: 24px;
    line-height: 24px;
    font-size: 18px;
    border: 1px solid #dcdfe6;
  }
  .content input:focus {
    outline: none;
    border-color: #409eff;
  }
  .content input:focus-visible {
    outline-offset: 0px;
  }
</style>

效果

输入框连续输入数据

 多次点击按钮

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

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

相关文章

使用 Simulink 进行 STM32 编程

目录 介绍 所需材料 步骤 1&#xff1a;在MATLAB中设置STM32-MAT软件路径步骤 2&#xff1a;在STM32CubeMX中创建一个项目步骤 3&#xff1a;配置时钟和 GPIO 引脚步骤 4&#xff1a;项目经理并生成代码步骤 5&#xff1a;在 Simulink 中创建模型步骤 6&#xff1a;在模型中插…

前端如何实现一个网站的桌面快捷方式

题记&#xff1a;我们工作中常常需要在我们的网站首页实现一个桌面快捷方式&#xff0c;那么我们怎么做呢&#xff1f; 图片展示&#xff1a; 代码实现&#xff1a; 第一步&#xff1a;获取路径与标题名&#xff1b; sName: document.title, sUrl: window.location.href 第二步…

Java版知识付费平台免费搭建 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台qt

&#xfeff;Java版知识付费源码 Spring CloudSpring BootMybatisuniapp前后端分离实现知识付费平台 提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含&#xff1a;录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署&#xff0c;免费售…

c++11 标准模板(STL)(std::basic_ofstream)(一)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ifstream : public std::basic_istream<CharT, Traits> 类模板 basic_ifstream 实现文件流上的高层输入操作。它将 std::basic_istrea…

【Selenimu+AutoIT】非input标签上传文件(带参数)

工具下载 非input标签上传文件&#xff0c;就需要借助第三方工具&#xff0c;如AutoIT。 AutoIT下载 安装步骤略 使用 1.打开Auto Window Info 找到这个打开 拖住红框里面的标到需要定位的地方记录下来 2.打开SciTE Script Editor 打开后&#xff0c;修改为UTF-8&am…

程序员有必要参加软考吗?

作为程序员&#xff0c;如果一直从事着前线的编程工作&#xff0c;是否会对身体造成负担&#xff0c;难以持续到35岁呢&#xff1f;毕竟在项目赶期时&#xff0c;工作强度很高&#xff0c;而技术也在不断变化&#xff0c;因此很多程序员在30岁前就开始转型。我曾见过很多焦虑自…

观察者模式——对象间的联动

1、简介 1.1、概述 在软件系统中&#xff0c;有些对象之间也存在类似交通信号灯和汽车之间的关系。一个对象的状态或行为的变化将导致其他对象的状态或行为也发生改变&#xff0c;它们之间将产生联动&#xff0c;正所谓“触一而牵百发”。为了更好地描述对象之间存在的这种一…

【C++】初阶 --- 引用(超级详细版!!!)

文章目录 &#x1f36a;一、引用的概念&#x1f36a;二、引用的特性&#x1f37f;1、引用在定义时必须初始化&#x1f37f;2、一个变量可以有多个引用&#x1f37f;3、引用一旦引用一个实体&#xff0c;再不能引用其他实体 &#x1f36a;三、常引用(被const 修饰的引用)&#x…

idea打开传统eclipse项目

打开传统web项目 1.打开后选择项目文件 2.选择项目结构 3.设置jdk版本 4.导入当前项目模块 5.选择eclipse 6. 设置保存目录 7.右键模块&#xff0c;添加spring和web文件 8. 设置web目录之类的&#xff0c;并且创建打包工具 9.如果有本地lib&#xff0c;添加为库 最后点击应用&…

【linux】Linux桌面应用程序快捷方式

在linux系统里&#xff0c;很多应用程序虽然有对应的版本&#xff0c;但是下载了之后发现打开方式并不友好&#xff0c;比如&#xff0c;今天下载了DataGrip&#xff0c;打开文件夹才发现它里面有这些&#xff1a; 红框内的脚本是其正确的打开方式。每次你都要执行&#xff1a…

一篇文了解SHA2代码签名

在当今数字时代&#xff0c;各种网络隐私安全威胁层出不穷&#xff0c;对此&#xff0c;我们也采取了很多安全措施。SHA2代码签名作为一种非常重要的安全措施&#xff0c;它有助于确保软件代码和文件的完整性和真实性。那么你知道SHA2代码签名是什么&#xff1f;它的原理是什么…

天线辐射机制

电磁场如何从源中产生并最终脱离天线辐射到自由空间中去的呢&#xff1f;让我们首先来研究一下一些基本的辐射源。 1、单线Single Wire 导线是一种电荷运动产生电流特性的材料&#xff0c;假设用qv&#xff08;库仑/m3&#xff09;表示的一个电体积电荷密度均匀分布在一个横截…

云安全攻防(五)之 容器基础设施所面临的风险

容器基础设施所面临的风险 容器基础设施面临的风险 我们从容器镜像、活动容器、容器网络、容器管理程序接口、宿主机操作和软件漏洞六个方面来分析容器基础设施可能面临的风险 容器镜像存在的风险 所有容器都来自容器镜像。与虚拟机镜像不同的是&#xff0c;容器镜像是一个不…

基于埋点日志数据的网络流量统计 - PV、UV

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 一、 网站总流量数统计 - PV 1. 需求分析 2. 代码实现 方式一 方式二 方式三&#xff1a;使用process算子实现 方式四&#xff1a;使用process算子实现 二、网站独立访客数统计 - UV 1. …

新闻稿代写软件有哪些?聪明灵犀工具助你撰写合格新闻稿

新闻稿代写软件有哪些&#xff1f;新闻稿是一种重要的宣传工具&#xff0c;但是撰写优秀的新闻稿需要一定的写作技巧和经验。幸运的是&#xff0c;现在有许多新闻稿代写软件可供使用&#xff0c;这些工具可以帮助你撰写出更优质的新闻稿。本文将介绍一些常用的新闻稿代写软件以…

【性能调优-实例演示】CPU爆了怎么定位问题--》调试指令性能分析工具

性能调优 定位生产性能问题 生产环境&#xff0c;CPU Memory 告警 top&#xff1a;找出占CPU比较高的进程${pid}&#xff08;内存增长&#xff0c;CPU居高不下&#xff09;top -Hp ${pid}&#xff1a;显示所有线程的CPU占比&#xff0c;观察进程中的线程&#xff0c;找出哪个…

Vol的学习

首先学习基础用法 1.查看系统基本信息 vol.py -f 路径 imageinfo 2.查看进程命令行 vol.py -f 路径 --profile系统版本 cmdline vol.py -f 路径 --profile版本 cmdscan 3.查看进程信息 vol.py -f 路径 --profile系统 pslist 通过树的方式返回 vol.py -f 路径 --profile系统…

淘宝资源采集(从零开始学习淘宝数据爬取)

1. 为什么要进行淘宝数据爬取&#xff1f; 淘宝数据爬取是指通过自动化程序从淘宝网站上获取数据的过程。这些数据可以包括商品信息、销售数据、评论等等。淘宝数据爬取可以帮助您了解市场趋势、优化您的产品选择以及提高销售额。 淘宝作为全球的电商平台&#xff0c;每天都有…

从初学者到专家:Java 数据类型和变量的完整指南

目录 一、字面常量 1.1什么常量&#xff1f; 1.2常见的六种常量类型 二、数据类型 2.1什么是数据类型&#xff1f; 2.2基本数据类型&#xff1a; 2.3引用数据类型 三、变量 3.1什么是变量&#xff1f; 3.2变量的命名规则 3.3变量的作用域 3.4变量的被final修饰 四…

C++ 外部变量和外部函数

1.外部变量 如果一个变量除了在定义它的源文件中可以使用外&#xff0c;还能被其他文件使用&#xff0c;那么就称这个变量为外部变量。命名空间作用域中定义的变量&#xff0c;默认情况下都是外部变量&#xff0c;但在其他文件中如果需要使用这一变量&#xff0c;需要用extern…