手写节流throttle

节流throttle

应用场景
  • 滚动事件监听scroll:例如监听页面滚动到底部加载更多数据时,使用节流技术减少检查滚动位置的频率,提高性能。
  • 鼠标移动事件mousemove:例如实现一个拖拽功能,使用节流技术减少鼠标移动事件的处理频率。
  • 动画效果:当实现一个基于时间的动画效果时,使用节流技术限制动画帧率,降低计算开销。

它使用了闭包和setTimeout来确保函数fn在指定的delay时间内只被调用一次,即使它被频繁触发。这里是对您代码的一个详细解释:

有很多其他的实现方式....比对时间戳

定时器版
function throttle(fn, delay) {  // 创建一个标志位canRun,默认为true,表示函数可以被执行  let canRun = true;  // 返回一个新的函数,这个函数会包裹原来的fn函数  return function(...args) {  // 如果canRun为false,说明上一次fn的执行还没有完成,直接返回不执行  if (!canRun) {  return;  }  // 在函数执行前将canRun设为false,表示fn正在执行或等待执行  canRun = false;  // 使用setTimeout来设置一个延时,确保fn在delay时间后执行  // 注意:这里的this和args都是从外部函数捕获的,它们代表了原始事件处理函数的上下文和参数  setTimeout(() => {  // 在delay时间后,执行fn函数,并恢复canRun为true,表示可以再次执行fn  fn.apply(this, args);  canRun = true;  }, delay);  };  
}  // 使用示例  
const handleScroll = throttle(function() {  console.log('Scroll event handled.');  
}, 200); // 设置节流间隔为200毫秒  window.addEventListener('scroll', handleScroll);

在这个例子中,handleScroll是节流后的函数,它被用作scroll事件的处理程序。无论用户如何频繁地滚动页面,handleScroll函数都只会每200毫秒执行一次,从而有效地减少了不必要的计算和DOM操作,提高了页面的性能。

<!DOCTYPE html>  
<html lang="en">  
<head>  
<meta charset="UTF-8">  
<meta name="viewport" content="width=device-width, initial-scale=1.0">  
<title>Throttle Scroll Event Example</title>  
<style>  /* 为了演示,我们可以添加一些样式使页面更长 */  body {  height: 2000px;  }  
</style>  
</head>  
<body>  
<!-- 为了演示,这里添加一些内容使页面更长 -->  
<div style="height: 1000px;">Scroll down to see the throttled scroll event handler in action.</div>  <script>  // 定义节流函数  function throttle(fn, delay) {  let canRun = true;  return function(...args) {  if (!canRun) {  return;  }  canRun = false;  setTimeout(() => {  fn.apply(this, args);  canRun = true;  }, delay);  };  }  // 定义滚动事件处理函数  function handleScroll() {  console.log('Scroll event handled at', new Date().toISOString());  // 这里可以添加实际的滚动处理逻辑,比如加载更多内容、改变样式等  }  // 使用节流函数包装滚动事件处理函数  const throttledScrollHandler = throttle(handleScroll, 2000); // 设置节流间隔为200毫秒  // 添加滚动事件监听器  window.addEventListener('scroll', throttledScrollHandler);  </script>  </body>  
</html>

演示

补充:

时间戳版
  • 原理:通过比较当前时间和上一次执行函数的时间戳,来判断是否达到指定的时间间隔。
  • 示例代码
function throttle(func, wait) {  let previous = 0;  return function() {  let now = Date.now();  let context = this;  let args = arguments;  if (now - previous > wait) {  func.apply(context, args);  previous = now;  }  }  
}  // 使用方法  
content.onmousemove = throttle(count, 1000); // 每1秒执行一次count函数
使用lodash库
  • 示例代码
html复制代码<script src="./lodash.min.js"></script>  
<script>  const box = document.querySelector('.box');  let i = 1;  function mouseMove() {  box.innerHTML = i++; // 如果里面存在大量操作DOM的情况,可能会卡顿  }  box.addEventListener('mousemove', _.throttle(mouseMove, 500)); // 每500毫秒执行一次mouseMove函数  
</script>

节流防抖的区别

节流throttle指定的delay时间内只被调用一次,即使它被频繁触发;

防抖debounce,只要触发,就重新计算delay;

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

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

相关文章

分布式session共享配置

目录 1、spring-session 1.1 添加依赖 1.2 spring-mvc.xml配置文件 1.3 web.xml 2、tomcat配置session、共享 2.1 Tomcat配置 2.2 Web.xml配置 1、spring-session 官方文档&#xff1a;https://docs.spring.io/spring-session/docs/1.3.0.RELEASE/reference/html5/ 1.…

OpenCV中的圆形标靶检测——斑点检测算法(一)

1.导读 在上一节内容中我们简要描述了OpenCV中实现圆形标靶检测的API的使用方法,其处理流程可大致分为1)斑点形状的检测,和2)基于规则的斑点形状的过滤与定位。第一步将类似圆斑形状的区域检测出来,但可能存在一些误检测的噪声,第二步则利用圆斑的分布规则(M*N排列)进行…

攻防世界---misc---can_has_stdio?

1、下载附件是一个没有后缀的文件&#xff0c;尝试将后缀改为txt发现里面有一些特殊字符的编码 2、查阅资料得知它是一种编程代码 3、知道了它是什么代码之后&#xff0c;我们就去解码&#xff08;网址&#xff1a;El Brainfuck (copy.sh)&#xff09; 4、 flag{esolangs_for_f…

ChatTTS,语气韵律媲美真人的开源TTS模型,文字转语音界的新魁首,对标微软Azure-tts

前两天 2noise 团队开源了ChatTTS项目&#xff0c;并且释出了相关的音色模型权重&#xff0c;效果确实非常惊艳&#xff0c;让人一听难忘&#xff0c;即使摆在微软的商业级项目Azure-tts面前&#xff0c;也是毫不逊色的。 ChatTTS是专门为对话场景设计的文本转语音模型&#x…

文件上传题目练习

[HNCTF 2022 Week1]easy_upload 先尝试上传一个php文件&#xff0c;发现直接就成功了 用蚁剑测试连接成功 找到flag [NISACTF 2022]bingdundun~ 白名单上传 这里因为尝试了很多绕过方式都不成功&#xff0c;去搜索了一下wp&#xff0c;发现要用到Phar://伪协议 补充&#xff…

SSRF及相关例题

SSRF及相关例题 服务端请求伪造&#xff08;Server Side Request Forgery, SSRF&#xff09;指的是攻击者在未能取得服务器所有权限时&#xff0c;利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。SSRF攻击通常针对外部网络无法直接访问的内部系统。 SSR…

sql注入 (运用sqlmap解题)

注:level参数 使用–batch参数可指定payload测试复杂等级。共有五个级别&#xff0c;从1-5&#xff0c;默认值为1。等级越高&#xff0c;测试的payload越复杂&#xff0c;当使用默认等级注入不出来时&#xff0c;可以尝试使用–level来提高测试等级。 --level 参数决定了 sql…

鸿蒙应用开发之OpenGL应用和X组件12

在这个应用程序里还有一个功能,就是点击绘画四边形作出响应,也就是触摸X组件进行响应,所以X组件的点击函数响应在前面已经做设置了回调,当用户触摸这个组件时,就会调用函数DispatchTouchEventCB,再从这个函数里调用渲染对象的函数ChangeColor来改变颜色,如下两图是不同的…

<网络安全VIP>第二篇《工业控制软件》

1 PLC PLC,(Programmable Logic Controller),可编程逻辑控制器(PLC)是种专门为在工业环境下应用而设计的数字运算操作电子系统。 2 DCS 四、DCS的发展趋势 一、DCS的基本定义 DCS是分布式控制系统(Distributed Control System)的英文缩写,在国内自控行业又称之为集…

使用wireshark分析tcp握手过程

开启抓包 tcpdump -i any host 127.0.0.1 and port 123 -w tcp_capture.pcap 使用telnet模拟tcp连接 telnet 127.0.0.1 123 如果地址无法连接&#xff0c;则会一直重试SYN包&#xff0c;各个平台SYN重试间隔并不一致&#xff0c;如下&#xff1a; 异常站点抓包展示&#xff…

Fatfs

STM32进阶笔记——FATFS文件系统&#xff08;上&#xff09;_stm32 fatfs-CSDN博客 STM32进阶笔记——FATFS文件系统&#xff08;下&#xff09;_stm32 文件系统怎样获取文件大小-CSDN博客 STM32——FATFS文件基础知识_stm32 fatfs-CSDN博客 021 - STM32学习笔记 - Fatfs文件…

godot.bk4:how to make NPC roam and attack player with global variable‘s usage

1.为什么会有重力的影响&#xff1a;因为CharacterBody2D默认的代码是重力影响的&#xff0c;删掉即可 只需要添加 extends CharacterBody2Dconst SPEED 200.0 var directionfunc _physics_process(delta):direction Input.get_vector("ui_left", "ui_right&…

第一周:计算机网络概述(上)

一、计算机网络基本概念 1、计算机网络通信技术计算机技术 计算机网络就是一种特殊的通信网络&#xff0c;其特殊之处就在于它的信源和信宿就是计算机。 2、什么是计算机网络 在计算机网络中&#xff0c;我们把这些计算机统称为“主机”&#xff08;上图中所有相连的电脑和服…

【Java】---- SpringBoot 统一数据返回格式

目录 1. 统一数据返回格式介绍2. 实际应用2.1 添加前后的返回结果区别2.2 存在问题 3. 统一数据返回格式的优点 1. 统一数据返回格式介绍 通过使用ControllerAdvice和引用ResponseBodyAdvice接口来进行实现。 ResponseBodyAdvice这个接口里面有两个方法&#xff0c;分别是: s…

【专利 超音速】基于分类模型的轻量级工业图像关键点检测方法

申请号CN202311601629.7公开号&#xff08;公开&#xff09;CN117710683A申请日2023.11.27申请人&#xff08;公开&#xff09;超音速人工智能科技股份有限公司发明人&#xff08;公开&#xff09;张俊峰(总); 杨培文(总); 沈俊羽; 张小村 摘要 本发明涉及一种基于分类模型的…

外星人Alienware m16R1 原厂Windows11系统 oem系统

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…

VB.net实战(VSTO):Excel插件设计Ribbon界面

1. 新建Ribbon 1.1 开发环境 Visual Studio 2022 1.2 解决方案资源管理器中右击My Project 1.3 添加》新建项 1.4 office/SharePoint》功能区(可视化设计器)&#xff0c;双击 2.调出工具箱 Visual Studio 2022》视图》工具箱 3.设计界面 3.1 添加功能区选项卡 3.2拖动Group…

深度强化学习+大模型综述Survey on Large Language Model-Enhanced Reinforcement Learning

论文地址&#xff1a;[2404.00282] Survey on Large Language Model-Enhanced Reinforcement Learning: Concept, Taxonomy, and Methods (arxiv.org) 摘要 对 LLM 增强 RL 中现有文献进行了全面的回顾&#xff0c;并总结了其与传统 RL 方法相比的特征&#xff0c;旨在阐明未…

混合A*算法详解(一)路径搜索

描述 为了学习一下混合A*算法&#xff0c;我前面介绍了车辆运动学及非完整约束、差速轮及阿克曼运动学模型、Dubins曲线和RS曲线&#xff0c;现在终于可以看一下混合A*算法的相关内容了。 原文名称&#xff1a;Practical Search Techniques in Path Planning for Autonomous D…

Mac解决command not found:mvn 保姆级

1.背景 mac电脑已经安装了jdk1.8。如果不清楚自己jdk安装位置的可以到idea查看。但是命令行执行 mvn 会报 command not found 2.解决方案 默认安装的 jdk 是没有配置环境变量&#xff0c;因此需要手动配置 通常如果是默认安装则路径都会一样直接复制即可&#xff0c;只需更…