原生js中的防抖节流笔记

news2024/11/15 11:16:08

防抖,单位时间内,频繁触发,只执行最后一次

效果演示

  • 优化前,不断触发,浪费性能
    请添加图片描述

  • 优化后,只在指定时间内触发
    请添加图片描述

演示代码

import debounce from "/node_modules/lodash-es/debounce.js";
const oBox = document.getElementById("box");
let index = 0;
function move() {
  this.innerHTML = index++;
}

//默认进来调用一次
move.call(oBox);
//使用防抖
oBox.addEventListener("mousemove", debounce(move, 1000));
//不使用防抖
// oBox.addEventListener("mousemove", move);

//自己封装的防抖
function _debounce(fn, delay) {
  clearTimeout(this.timeId);
  this.timeId = setTimeout(() => {
    move.call(this);
  }, 1000);
}
 #box{
      width: 100px;
      height: 100px;
      background: red;
      color:#fff;
      text-align: center;
      cursor: pointer;
     }
<div id="box"></div>

封装优化

function _debounce(fn, delay) {
  //默认进来调用一次
  move.call(oBox);
  return function () {
    clearTimeout(fn.timeId);
    fn.timeId = setTimeout(() => {
      move.call(this);
    }, delay);
  };
}

节流,单位时间内,频繁触发,只执行第一次,期间触发不执行,500s再执行
窗口大小改变时的布局调整:当用户快速调整窗口大小时,节流可以确保在每个时间段内只执行一次布局调整操作,避免过度渲染。
滚动事件的处理:滚动事件可能会非常频繁地触发,节流可以限制滚动事件处理器的执行频率,提高性能。
使用场景: 比如: 监听滚动条,每隔一段时间计算一次位置

请添加图片描述

在定时器里面是无法清除定时器的,这是一个bug,在定时器外面可以清除,所以必须手动重置为null

封装节流

oBox.addEventListener("mousemove", _throttle(move, 500));

function _throttle(fn, delay) {
  //默认进来调用一次
  fn.call(oBox);
  const mowTime = Date.now();
  return function () {
    if (fn.timeId) return;
    fn.timeId = setTimeout(() => {
      fn.call(this);
      // 在定时器里面是无法清除定时器的,这是一个bug,在外面可以清除
      clearTimeout(fn.timeId);
      // fn.timeId = null;
    }, delay);
  };
}
function _throttle2(fn, delay) {
  let now = Date.now();
  // 第一次进来,直接执行
  fn.call(oBox);
  // 第二次进来,判断是否超过了规定时间
  // 超过了规定时间,执行
  return function () {
    const t = Date.now() - now - delay;
    if (t >= 0) {
      fn.call(this);
      now = Date.now();
    }
  };
}

请添加图片描述
不手动重置定时器,触发是没反应的

总结

在这里插入图片描述

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

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

相关文章

专业养生调理保健传承者——五指生望京店开业送健康

2024年8月22日&#xff0c;即处暑时节&#xff0c;五指生望京店盛情开业&#xff01;在这个暑意渐消的美好时节&#xff0c;望京店希冀为更多尊贵生命带来健康。 五指生成立于2001年&#xff0c;作为“全国五星级保健服务机构”&#xff0c;曾先后获得“首都文明单位”“北京市…

Java学习Day34:图书管理小项目

搭建过程 1.根据需求设计数据库 概念设计&#xff1a;使用ER图等工具设计数据库概念模型&#xff0c;明确实体、属性、关系。逻辑设计&#xff1a;将概念模型转换为数据库表结构&#xff0c;确定主键、外键、索引等。物理设计&#xff1a;根据数据库管理系统的特性进行物理存…

【运维】docker搭建portainer

1.拉取镜像 并 启动容器 1.1 拉取镜像 docker pull 6053537/portainer-ce1.2 启动容器 docker run -d --restartalways --name"portainer" -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock 6053537/portainer-ce2.访问地址 ip地址9000端口 密码&…

True XML cookbook

打开题目 看到登录口 随便输入admin&#xff0c;123456&#xff0c;然后抓包试一下 先按原来那道题的payload进行测试&#xff0c;payload和结果如下&#xff1a; <?xml version"1.0" ?> <!DOCTYPE llw [ <!ENTITY file SYSTEM "file:///flag&…

Linux驱动入门实验班——DAC模块驱动(附百问网视频链接)

目录 前言 一、 SPI数据结构 1.SPI设备驱动 2.SPI设备数据结构 二 、函数接口 1.spi_sync_transfer 2.spi_register_driver 三、DAC 1.数据格式 2.数据结构 四、源码 驱动 应用 课程链接 前言 在这里主要记录学习韦东山老师Linux驱动人入门实验班的笔记&#xff0…

计算机网络——HTTP与HTTPS协议

HTTP与HTTPS是应用层的协议。 目录 一、HTTP 二、HTTPS 三、HTTP与HTTPs对比 四、HTTP/1.0 HTT/1.1 HTTP/2有什么区别 五、HTTP常用请求方法&#xff1f;get/post区别&#xff1f; 六、HTTP的工作过程 七、HTTPS的工作过程 八、Cookie、Session、Token 一、HTTP 超…

【CAN总线测试】——CAN物理层测试

从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者&#xff0c;时光不负有心人。 目录 1.最小通讯电压测试 2.最大通讯电压测试 3.显性位/隐性位输出电压测试 4.信号跳变沿测试 5.地偏移 6.终端电阻 1.7. CANH/CANL短路 1.8. CANH /GND短路 …

Verilog刷题笔记58

题目&#xff1a; Exams/2014 q3c 解题&#xff1a; module top_module (input clk,input [2:0] y,input x,output Y0,output z );parameter s03d000,s13d001,s23d010,s33d011,s43d100;always(*)begincase(y)s0:Y0x;s1:Y0~x;s2:Y0x;s3:Y0~x;s4:Y0~x;endcaseendassign z(y3b01…

Kafka运行机制(二):消息确认,消息日志的存储和回收,生产者消息分区

前置知识 Kafka基本概念https://blog.csdn.net/dxh9231028/article/details/141270920?spm1001.2014.3001.5501Kafka运行机制&#xff08;一&#xff09;&#xff1a;Kafka集群启动&#xff0c;controller选举&#xff0c;生产消费流程https://blog.csdn.net/dxh9231028/arti…

Verilog刷题笔记57

题目: Exams/2014 q3bfsm Given the state-assigned table shown below, implement the finite-state machine. Reset should reset the FSM to state 000. 解题&#xff1a; module top_module (input clk,input reset, // Synchronous resetinput x,output z );parameter…

ESP32-IDF 在 Ubuntu 下的配置

目录 一、安装准备二、获取 ESP-IDF三、设置工具四、使用案例 参考资料&#xff1a;官方文档&#xff1a;Linux 和 macOS 平台工具链的标准设置。 一、安装准备 参照官方文档&#xff0c;首先下载编译 ESP-IDF 所需要的软件包&#xff1a; sudo apt-get install git wget fl…

如何使用ssm实现基于Java的共享客栈管理系统

TOC ssm058基于Java的共享客栈管理系统jsp 第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各…

一篇快速搞懂 JavaSE 高级特性(代码块,注解,枚举,异常处理,多线程,集合框架,泛型,反射,IO ......)

JavaSE 高级 一、面向对象&#xff08;高级&#xff09;1、单例模式&#xff08;Singleton&#xff09;2、代码块1&#xff09;静态代码块2&#xff09;非静态代码块 3、关键字 final4、抽象类与抽象方法&#xff08;abstract&#xff09;5、模板方法设计模式&#xff08;Templ…

利用GPT绘制流程图(无需下载任何软件

目录 什么是Flowchart Fun&#xff1f;如何利用GPT绘制流程图&#xff1f;步骤1&#xff1a;确定流程图的目的和内容步骤2&#xff1a;训练GPT编写流程图的文本描述步骤3&#xff1a;转换文本格式为可视化的流程图步骤4&#xff1a;调整和优化 结论小结&#xff1a; 什么是Flow…

SpringBoot【重修之HTTP协议】

request 请求&#xff0c;response 响应&#xff01; HTTP-协议的解析&#xff1a; 客户端&#xff1a;浏览器已经会自动解析了 服务端&#xff1a;通过Web服务器来解析&#xff01;【Tomcat , Jetty , WebLogic , WebSphere 】 Tomcat的研究学习 SpringBoot Web快速入门…

AIxBoard部署BLIP模型进行图文问答

一、AIxBoard简介 AIxBoard&#xff08;X板&#xff09;是一款IA架构的人工智能嵌入式开发板&#xff0c;体积小巧功能强大&#xff0c;可让您在图像分类、目标检测、分割和语音处理等应用中并行运行多个神经网络。它是一款面向专业创客、开发者的功能强大的小型计算机&#xf…

[Linux CMD] 查看系统资源 (持续更新中)

概述 在Linux中&#xff0c;有许多命令和工具可用于查看系统的资源使用情况。以下是一些常用的方式&#xff1a; top&#xff1a;top命令是最常见的实时系统监视工具之一。它显示了当前运行的进程列表&#xff0c;以及每个进程的CPU、内存使用情况、nice值等信息。top命令还会…

【Linux】简易日志工具项目

有些鸟儿是不应该被关在笼子里的&#xff0c; 因为他们的羽毛太丰润了。 当他们飞走&#xff0c;你会由衷地庆贺他获得自由。 --- 肖申克的救赎》--- 从零开始构建简易日志系统 1 日志1.1 什么是日志1.2 日志的意义1.3 为什么要构建自己的日志工具 2 构建自己的日志工具2.1…

带有限制编辑的PDF文件怎么取消编辑限制

在日常工作和学习中&#xff0c;我们经常会遇到一些带有“限制编辑”的PDF文件。这些文件由于设置了密码保护&#xff0c;使得我们无法直接编辑、复制或打印其中的内容&#xff0c;给信息的处理和利用带来了诸多不便。然而&#xff0c;通过一些有效的方法和工具&#xff0c;我们…

C++—八股文总结(25秋招期间一直更新)

1、const 1.1 指针常量和常量指针 说说const int *a, int const *a, const int a, int *const a, const int *const a分别是什么&#xff0c;有什么特点。 const int *aint const *a; //可以通过 a 访问整数值&#xff0c;但不能通过 a 修改该整数的值&#xff0c;指针本身是…