首页 > 其他分享 >JS防抖和节流

JS防抖和节流

时间:2023-09-17 18:33:58浏览次数:59  
标签:触发 防抖 const 节流 JS 事件 函数

引言:

在前端开发中,性能优化是至关重要的。在处理用户输入、滚动事件、表单提交以及其他频繁触发的操作时,防抖和节流是两个常用的技术,用来减少不必要的资源消耗和提高用户体验。

什么是防抖和节流?

  • 防抖:它限制了一个函数在连续触发事件后的执行次数。如果在一段时间内多次触发同一事件,只有最后一次触发后,函数才会执行。也就是说如果用户连续快速点击按钮,只有最后一次点击会触发事件。

  • 节流:它确保一个函数在一定时间内只能执行一次。无论事件触发多频繁,都会按照设定的时间间隔执行函数。这对于滚动事件或输入框实时搜索等情况非常有用。

防抖的实验原理:

防抖的原理很简单。当事件被触发时,启动一个定时器,在指定的延迟时间后执行函数。如果在这段时间内再次触发事件,将清除前一个定时器并重新启动。这样,只有当事件停止触发一段时间后,函数才会执行。

适用场景:

  • 按钮点击事件,防止用户多次快速点击。
  • 窗口大小调整事件,以优化性能。
  • 输入框输入事件,用于实时搜索建议。

防抖例子:

function debounce(func, delay) {
  let timer;
  return function() {
    const context = this;
    const args = arguments;
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(context, args);
    }, delay);
  };
}

// 用法示例:
const debouncedFn = debounce(() => {
  // 处理逻辑
}, 300);

// 绑定到按钮点击事件
document.getElementById('myButton').addEventListener('click', debouncedFn);

节流的实验原理:

节流的原理与防抖类似,但有一个关键区别:无论事件频率多高,函数都会按照指定的时间间隔执行。如果在执行期间再次触发事件,将被忽略,直到时间间隔结束。

适用场景:

  • 滚动事件,以减少滚动时的事件处理次数。
  • 鼠标移动事件,以减少鼠标移动时的资源消耗。
  • 实时数据更新,以限制频繁更新。

节流的JavaScript编码实现:

function throttle(func, delay) {
  let canRun = true;
  return function() {
    if (!canRun) return;
    canRun = false;
    const context = this;
    const args = arguments;
    func.apply(context, args);
    setTimeout(() => {
      canRun = true;
    }, delay);
  };
}

// 用法示例:
const throttledFn = throttle(() => {
  // 处理逻辑
}, 300);

// 绑定到滚动事件
window.addEventListener('scroll', throttledFn);

结论:

防抖和节流是两种用来优化前端性能的重要技术。可以有效地优化代码性能,提高用户界面的流畅度。当然在实际开发中,要根据具体的应用场景选择合适的防抖或节流策略,以确保代码的最佳性能。

标签:触发,防抖,const,节流,JS,事件,函数
From: https://www.cnblogs.com/dawnyu/p/17709399.html

相关文章

  • JS计算数组层级(深度)
    如果有一个多层嵌套的数组,想要计算其层级(深度),可以使用递归或迭代方法来实现。以下是两种常用的方法示例:递归方法:functioncalculateDepth(arr){if(!Array.isArray(arr)){return0;//如果不是数组,返回0表示不是层级结构}letmaxDepth=0;for(const......
  • 添加Element ui依赖报错:npm ERR code EPERM,syscall mkdir, npm ERR! path D:\Vue\
    添加Elementui依赖报错:npmERRcodeEPERM,syscallmkdir,npmERR!pathD:\Vue\nodejs\node_cache\_cacache\index-v5\f3\de具体报错信息如下:我这个是在IDEA控制台输入npmielement-ui-S添加elementui依赖时出现的报错解决办法:修改nodejs(安装node的安装地址那里)......
  • 好用的C语言JSON解析器
    本文介绍开源C语言库Melon的JSON解析器。相信很多读者都听说过甚至使用过cJSON开源库。那么本文就拿cJSON与Melon的JSON组件进行对比。下面我们就来一起看一看。编码Encode假设我们要构建如下JSON:{"name":"Awesome4K","resolutions":[{"w......
  • JS判断对象是否为空对象的几种方法
    通过JSON自带的stringify()方法来判断functionisEmptyObj(obj){returnJSON.stringify(obj)==='{}'}console.log('对象是否为空:',isEmptyObj({}))forin循环判断functionisEmptyObj(obj){for(letiteminobj){returntrue}returnf......
  • FastAPI学习-15.JSON 编码器 jsonable_encoder
    前言在某些情况下,您可能需要将数据类型(如Pydantic模型)转换为与JSON兼容的数据类型(如dict、list等)。比如,如果您需要将其存储在数据库中。对于这种要求, FastAPI提供了jsonable_encoder()函数。使用jsonable_encoderjsonable_encoder在实际应用场景中,可能需要将数据类型(如:Py......
  • js获取select选中的标签option的值
    js中获取方法varobj=document.getElementById(”testSelect”);//定位idvarindex=obj.selectedIndex;//选中索引vartext=obj.options[index].text;//选中文本varvalue=obj.options[index].value;//选中值jQuery中获得选中select值第一种方式(......
  • JS 日期比较大小的简单实例
    一 varbeginDate='2015-06-17';varendDate='2015-06-15';vard1=newDate(beginDate.replace(/\-/g,"\/"));vard2=newDate(endDate.replace(/\-/g,"\/"));if(beginDate!=""&&endDate!=""......
  • js操作iframe
    父页面<iframename="iframe1"></iframe><iframename="iframe2"></iframe><scripttype="text/javascript">functionp_mothd1(){alert('p_mothd1');}</script>子页面iframe1页面functioni......
  • css+js:实现tab切换线条跟随效果
    (目录)实现效果使用css和js实现一个tab切换的效果原理解析如上图红色框框代表盒子,总宽度记作totalWidth绿色框框代表每一项,宽度记作itemWidth深蓝色框框代表的是下划线,宽度记作activeWitdh那么我们可以得到线的左边距是每一项的左边距加上一个值这个值是每一项的......
  • 如何从 javascript 中的 Web api 将 json 对象传递到项目的其余部分
    在将从WebAPI获取的JSON数据传递到项目的其他部分之前,您需要确保在完成fetch请求并获得响应后再进行处理。因为fetch是一个异步操作,需要等待服务器响应的完成才能获取到数据。在您的代码示例中,您可以将json数据传递给其他函数或组件进行后续处理。以下是一种可能的处理方式:fetch(B......