首页 > 其他分享 >分别写出防抖和节流的两个函数,并描述它们分别有什么运用场景?

分别写出防抖和节流的两个函数,并描述它们分别有什么运用场景?

时间:2024-11-25 09:00:00浏览次数:8  
标签:function 触发 防抖 节流 事件 addEventListener 分别

// 防抖函数 (Debounce)
function debounce(func, delay) {
  let timer;
  return function() {
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(this, arguments);
    }, delay);
  };
}

// 节流函数 (Throttle)
function throttle(func, delay) {
  let lastTime = 0;
  return function() {
    const nowTime = Date.now();
    if (nowTime - lastTime >= delay) {
      func.apply(this, arguments);
      lastTime = nowTime;
    }
  };
}


// 防抖运用场景:

// 1. 搜索框输入建议:用户输入时,不必每次输入都发送请求,而是等待用户停止输入一段时间后,再发送请求获取建议,减少服务器压力。
const searchInput = document.getElementById('search');
searchInput.addEventListener('input', debounce(function() {
  // 发送搜索请求
  console.log('Searching:', this.value);
}, 300)); // 300ms 的防抖延迟


// 2. 窗口大小调整:窗口大小调整频繁触发 resize 事件,使用防抖可以减少事件处理频率,例如在窗口大小改变后重新计算布局。
window.addEventListener('resize', debounce(function() {
  // 重新计算布局
  console.log('Resizing window');
}, 200)); // 200ms 的防抖延迟


// 节流运用场景:

// 1. 滚动加载:页面滚动时,不断触发 scroll 事件,使用节流可以控制加载频率,例如每隔一段时间加载一部分数据。
window.addEventListener('scroll', throttle(function() {
  // 加载更多数据
  console.log('Scrolling and loading data');
}, 200)); // 200ms 的节流间隔


// 2. 鼠标移动跟踪/游戏:鼠标移动会频繁触发 mousemove 事件,使用节流可以降低事件处理频率,例如每隔一段时间记录一次鼠标位置。
const mouseTracker = document.getElementById('mouse-tracker');
document.addEventListener('mousemove', throttle(function(event) {
  mouseTracker.textContent = `Mouse position: ${event.clientX}, ${event.clientY}`;
}, 100)); // 100ms 的节流间隔


// 3.  按钮点击防止重复提交:  防止用户快速多次点击按钮,导致重复提交表单或者触发多次事件。
const submitButton = document.getElementById('submit');
submitButton.addEventListener('click', throttle(function(event) {
  // 提交表单
  console.log('Submitting form');
  //  一些其他的操作,例如禁用按钮,显示 loading 状态等
}, 500)); // 500ms 的节流间隔,防止用户在短时间内多次点击


关键区别和总结:

  • 防抖 (Debounce): 在事件被触发后,设定一个定时器,如果在设定的时间内再次触发该事件,则清除前一个定时器并重新设定一个新的定时器。只有当事件停止触发一段时间后,才会执行真正的操作。 目的: 减少事件的触发频率,通常用于最后一次操作后才执行的场景。

  • 节流 (Throttle): 在一段时间内,只允许事件执行一次。如果在设定的时间内再次触发该事件,则忽略该事件。 目的: 控制事件的触发频率,通常用于持续触发事件,但需要限制频率的场景。

选择哪个取决于你的具体需求:

  • 如果只需要最后一次结果,例如搜索建议,使用防抖。
  • 如果需要在一段时间内持续响应事件,但要控制频率,例如滚动加载,使用节流。

标签:function,触发,防抖,节流,事件,addEventListener,分别
From: https://www.cnblogs.com/ai888/p/18566846

相关文章

  • SWJTU数电实验:按键防抖动设计
    本文还未验收,仅供参考,我看别人的更复杂一点,或许我的有问题。实验要求用VerilogHDL设计一个按键防抖动电路,要求用有限状态机实现。防抖动电路的输入接实验箱的按键/开关(SW0),输出接实验4计数器电路的时钟输入,实现每按一次按键(或拨一次开关)计数器加1,多......
  • 统计字符串中整数个数并分别输出数字(超级详细)
    【问题描述】输入一行字符串,不要超过80个字符,含有数字和非数字字符以及空格等,如:df23adfd562343?23dgjop535如果将其中所有连续出现的数字视为一个整数,要求统计在该字符串中共有多少个整数,并将这些数依次输出。【输入说明】只有一行,含有数字和其它任意字符。该行最长含80......
  • 行内元素、块级元素、空(void)元素分别有哪些?
    在前端开发中,HTML元素主要分为三种类型:行内元素、块级元素和空元素。它们在页面布局和渲染方面有不同的表现。1.行内元素(InlineElements):行内元素在水平方向排列,只占据必要的宽度,不会另起一行。它们设置宽度width、高度height和垂直方向的margin、padding属性无效,但......
  • 分别封装精确运算的加减乘除四个方法
    /***精确加法*@param{number|string}arg1*@param{number|string}arg2*@returns{number}*/functionaccurateAdd(arg1,arg2){letr1,r2,m;try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}try{r2=arg2.t......
  • 你有画过流程图吗?用过什么软件?开始和判定分别用什么图形表示?
    流程图符号:开始/结束:通常用椭圆形或圆角矩形表示。判定:通常用菱形表示。处理:通常用矩形表示。输入/输出:通常用平行四边形表示。流程线:用箭头连接各个图形,表示流程的方向。前端开发常用流程图场景举例:一个简单的用户登录流程图:开始:(椭圆形)用户输入用......
  • 分别写出数组的交集、并集、差集、补集这四个方法
    /***Calculatestheintersectionoftwoarrays.**@param{Array}arr1Thefirstarray.*@param{Array}arr2Thesecondarray.*@returns{Array}Anewarraycontainingtheelementspresentinbothinputarrays.*/functionintersection(arr1,arr......
  • 举例说明你对ol和ul标签的区别?它们的运用场景分别是什么呢?
    ol和ul标签都是用于创建列表的HTML标签,但它们代表不同类型的列表,因此应用场景也不同。1.ol(OrderedList-有序列表)含义:ol标签创建的是有序列表,列表中的每一项都有一个特定的顺序,通常用数字或字母表示。运用场景:当需要展现一系列有先后顺序、步骤性、排名性的......
  • 请描述下null和undefined的区别是什么?这两者分别运用在什么场景?
    在JavaScript中,null和undefined都表示值的缺失,但它们有细微的差别,并在不同的场景下使用。undefined含义:表示变量已声明但尚未赋值。也可以理解为变量的默认初始状态。JavaScript引擎会自动给未赋值的变量赋予undefined值。场景:访问未定义的变量:尝试访问一个不存......
  • video和audio分别支持哪些格式?
    在前端开发中,video和audio标签支持的格式主要由浏览器决定,虽然理论上都遵循HTML5标准,但实际支持情况略有差异。为了最大程度的兼容性,通常需要提供多种格式的视频和音频文件。Video支持的格式:MP4(MPEG-4Part14):最广泛支持的格式,通常使用H.264视频编解码器和AAC音频......
  • Java的Stream流编程的排序sorted方法里参数o1,o2分别代表什么?
    先说结论:在sorted方法中,o1是最后面的元素,o2是倒数第二个元素,以此类推,流是处理元素是从后面开始取值。  packagecom.br.itwzhangzx02.learn;     importorg.junit.Test;   importjava.util.ArrayList; importjava.util.List;......