js——防抖

本文介绍了一种常用的前端性能优化技术——防抖(debounce),通过限制事件处理函数的触发频率来减少不必要的计算开销。文中提供了两种实现方式:一种是直接在事件监听中使用setTimeout进行控制,另一种是将防抖逻辑封装成一个通用函数。这两种方式都能有效避免在短时间内频繁触发事件导致的性能问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

防抖(debounce)-性能优化方式之一

监听一个输入框,文字变化后触发change事件,直接用Keyup事件,则会频繁触发change事件;防抖:用户输入结束或者暂停时(触发间隔操过设定时间时才进行指定操作),才触发change事件

说在前面:
1)aplly用法详解

2)keyup事件
在这里插入图片描述

代码实现:

1:未封装版本

const inputDom = document.getElementById('input')
let timer
inputDom.addEventListener('keyup', () => {
   if(timer) {
     claerTimeout(timer)
   }
   timer = setTimeout(() => {
	   // 模拟触发change事件
	   console.log(inputDom.value)
	   // 清空计时器
	   timer = null
    }, 500)
})

比如输入连续输入123,触发了三次keyup事件;输入1时,timer为空,便给timer设置了个0.5s的计时器,语气是到了时间再针对1触发change事件,但随后立即又输入了2,这时timer有值,便清空了对1的计时器,重新设置了0.5s关于2可以触发change事件的计时器,最后又输入3,同理最后只剩下关于3的可触发change事件的计时器;等到0.5s后发现暂无输入,便触发了change事件;减少了触发change事件的次数:触发间隔操过设定时间时才进行指定操作
2)封装版本

function debounce(fn, delay = 500) {
	// 是闭包中的
	let timer
	
// input事件调用的函数,相当于obj调用函数 this指向Input
    return function() {
       // 这个if 判断不做也没关系,可直接清空,只有第一次timer非空
	   if(timer) {
	      claerTimeout(timer)
	   }
	   // 此时的箭头函数的this 和 arguments 都是从外部函数继承而来
	   // r如果用普通函数就要用词法作用域 var thsta = this var arg = arguments
	   timer = setTimeOut(() =>{
	      // 使得传入的回调函数的this 指向Input这个元素对象
	      // arguments是该事件的详情,可以获得该函数被调用时的所有参数,是一个event 对象(所有Dom事件都会传event对象进入)
	      // 直接使用 fn() 问题也不大
	      fn.apply(this,arguments) 
	      timer = null
	   },delay)
   }
}
// 直接使用
input.addEventListener('keyup', debounce(() => {
   // 可直接使用this.value获得输入框的值; arguments可用于获取具体触发事件的信息
   console.log(input.value)
}), 600)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值