什么是防抖和节流?

2024-08-31 21:52
文章标签 节流 防抖

本文主要是介绍什么是防抖和节流?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

在进行窗口调整(resize)、滚动(scroll)以及输入框内容校验等操作时,若事件处理函数频繁调用,可能会给浏览器带来极大负担,从而导致用户体验变差。为了优化性能,我们可以使用防抖(debounce)和节流(throttle)技术来控制函数的调用频率,从而提高应用的效率和流畅度。它们的核心思想是通过设置时间间隔来限制函数的执行时机。

防抖(Debounce)

防抖技术的关键在于:在一个事件被触发后,等待一段时间(n秒)再执行回调函数。如果在这段时间内该事件再次被触发,则重新计时。这样可以有效减少函数的执行次数,特别适用于高频次的事件,如用户输入或窗口调整。

示例代码

未使用防抖的效果

var mydiv = document.getElementById('mydiv');
let count = 0;function myEvent() {mydiv.innerText = count++;
}mydiv.addEventListener('mouseover', function(event) {myEvent();
});

使用防抖后的效果

function debounce(fn, delay) {let timeout = null;return function() {if (timeout) {clearTimeout(timeout);}timeout = setTimeout(() => {fn.apply(this, arguments);}, delay);}
}var mydiv = document.getElementById('mydiv');
let count = 0;function myEvent() {mydiv.innerText = count++;
}mydiv.addEventListener('mouseover', debounce(myEvent, 2000));

原理说明

防抖的核心在于推迟函数的执行,直到事件触发停止一段时间后才执行回调。例如,在鼠标移动时,只有在最后一次触发事件后经过2秒钟才执行回调函数 myEvent。如果用户持续移动鼠标,函数会在最后一次移动后再等待2秒才执行。这种方式有效避免了高频事件的频繁处理,减少了对浏览器性能的影响。

节流(Throttle)

节流技术的关键在于:在一定时间间隔(delay)内,只允许函数执行一次,即使该时间间隔内事件被多次触发,也仅有第一次生效。节流可以有效降低函数执行频率,使事件处理更为稳定。

示例代码

定时器实现方式

function throttle(fn, delay) {let hasRun = false;return function() {if (hasRun) {return;}hasRun = true;setTimeout(() => {hasRun = false;fn.apply(this, arguments);}, delay);}
}var mydiv = document.getElementById('mydiv');
let count = 0;function myEvent() {mydiv.innerText = count++;
}mydiv.addEventListener('mouseover', throttle(myEvent, 2000));

时间戳实现方式

let div = document.querySelector('div');
var count = 0;function myEvent() {div.innerText = count++;
}div.onmouseover = throttle(myEvent, 2000);function throttle(func, wait) {let pre = 0;return function() {let now = new Date().getTime();if (now - pre > wait) {pre = now;func.apply(this);}}
}

原理说明

节流的核心在于限制函数的执行频率。无论事件触发的频率如何,函数将在每个时间间隔(delay)内只执行一次。例如,当鼠标持续移动时,回调函数 myEvent 每隔2000毫秒执行一次,这样可以有效控制函数的调用频率,减轻浏览器的负担。

应用场景

防抖应用场景

  1. 搜索联想:在用户输入搜索内容时,使用防抖来减少请求次数,提高搜索效率。
  2. 窗口调整:在窗口大小调整过程中,使用防抖来避免频繁触发事件,优化性能。
  3. 防止重复提交:在用户提交表单时,使用防抖来防止重复提交操作。

节流应用场景

  1. 鼠标点击:在鼠标快速点击时,使用节流来限制处理次数,避免过度触发事件。
  2. 滚动事件:在监听滚动事件时,例如判断是否滑动到底部自动加载更多内容,使用节流来控制事件触发频率。

通过合理运用防抖和节流技术,可以有效提升用户体验,同时优化浏览器性能。

这篇关于什么是防抖和节流?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125089

相关文章

Vue2电商项目(二) Home模块的开发;(还需要补充js节流和防抖的回顾链接)

文章目录 一、Home模块拆分1. 三级联动组件TypeNav2. 其余组件 二、发送请求的准备工作1. axios的二次封装2. 统一管理接口API----跨域3. nprogress进度条 三、 vuex模块开发四、TypeNav三级联动组件开发1. 动态展示三级联动数据2. 三级联动 动态背景(1)、方式一:CSS样式(2)、方式二:JS 3. 控制二三级数据隐藏与显示--绑定styl

前端防抖和节流函数的实现原理

在前端开发中,防抖(Debounce)和节流(Throttle)是两种常用的优化技术,它们主要用于减少事件处理函数的执行频率,从而提高程序性能和用户体验。 防抖(Debounce) 防抖的目的是确保一个操作在一段时间内只被执行一次。例如,当用户在一个输入框中快速连续输入文字时,我们可能希望只在用户停止输入之后的一小段时间后再去执行查询操作,以避免频繁触发不必要的API调用。 实现原理: 设

HOW - 支持防抖和远程加载的人员搜索组件(shadcn)

目录 特性一、使用示例二、具体组件实现三、解释1. 属性定义2. 状态管理3. 功能实现4. 渲染逻辑 特性 支持 focus 时即发起请求获取用户列表输入时 debounce 防抖选中后以 tag 形式展示选项,这次点击 x 删除搜索结果中若包含已选项会过滤,即隐藏已选中项支持设置指定选项 disabled 一、使用示例 shadcn - multiple-selecto

Vue3 + TypeScript 实现防抖(Debounce)和节流(Throttle)

在Vue3项目中结合TypeScript使用防抖(Debounce)和节流(Throttle)技术,可以有效提升应用的性能和用户体验,尤其是在处理频繁触发的事件(如滚动、窗口大小调整、输入框内容变化等)时。下面将详细介绍这两种技术的原理、使用方法以及适用场景。 一、防抖(Debounce) 原理: 防抖技术通过延迟函数的执行来减少函数的调用频率。在事件被触发n秒后再执行回调,如果在这

网页性能优化04-函数节流

函数节流(throttle) 1-函数节流介绍 1.先理解什么是js中的高频事件 高频事件 : 触发频率极高的事件。例如 滚动条事件onscroll 鼠标移动onmousemove 网页大小变化onresize等 高频触发:事件本身不是高频的,但是用户可以通过很快的手速来触发。例如用户疯狂快速点击 抢购按钮(onclick,onmousedown) 2.高频事件的危害 a.浪费资源

网页性能优化03-函数防抖

1.1-函数防抖 1.函数防抖介绍 1.什么是函数防抖? (debounce) 网上主流解释:函数防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。 参考博客:https://www.jianshu.com/p/f9f6b637fd6c参考博客:https://segmentfault.com/a/1190000018445196 笔

Javascript归纳与总结——this指向及其改变、new关键字与原型链、异步、闭包和函数防抖与节流

this指向及其改变 普通函数在调用时,this为obj.obj1.fun(),this->obj1,箭头函数在声明定义时this->obj。 Javascript中bind、call、apply區別-CSDN博客 new关键字与原型链  从原型链视角解读VueComponent与Vue关系_vue中重要的原型链关系-CSDN博客 prototype这个属性只有函数对象才有!(构造)

防抖与节流详细讲解

一、前言 在前端的面试中我们经常会听到面试官问到什么是防抖与节流?会需要我们详细的讲解他们各自的用法,以及不同点。 为此特地全面的讲解一下防抖与节流,在加深对二者的理解,同时方便大家参考。首先提出几个问题,希望大家带着问题来看这篇文章: 什么是防抖与节流?他们之间有什么联系,为什么总是一起问?他们之间的不同点是什么?他们各自的使用场景是什么?如何封装防抖与节流 二、防抖(debounce)

2021-08-18vue中防抖和节流相关处理方案实践

<template><div class="hello"><input type="text" v-model="msg" placeholder="edit me" @keyup='debounce'><button @click='clickEvent'> 点击了</button></div></template><script>export default {name: 'HelloWo

前端手写源码系列(一)—— 手写防抖和节流

目录 1.实现防抖函数(debounce)2.实现节流函数(throttle)时间戳的方式:定时器方式: 3.总结 1.实现防抖函数(debounce) 防抖函数原理:把触发非常频繁的事件合并成一次去执行 在指定时间内只执行一次回调函数,如果在指定的时间内又触发了该事件,则回调函数的执行时间会基于此刻重新开始计算 函数防抖是指在事件被触发 n 秒后再执行回调,如果在这