如何使用节流和防抖提升网站性能

半梦半醒丶 2023-3-8 5,022 3/8

当需要优化 JavaScript 代码的性能时,防抖和节流是两种非常有用的技术。

对于节流来说,可以设置一个固定的时间间隔,只有在时间间隔内没有触发事件时才会执行回调函数;对于防抖来说,则可以延迟一段时间后再执行回调函数,如果在延迟时间内又有触发事件,则重新计时。

 

防抖(Debounce)

 

防抖是指在事件被触发 n 秒后才执行回调函数,如果在这段时间内再次触发该事件,则重新计时。这种技术通常用于限制重复操作或者按键搜索。

function debounce(func, delay) {
	let timerId;
	return function (...args) {
		if (timerId) clearTimeout(timerId);
		timerId = setTimeout(() => func.apply(this, args), delay);
	};
}

 

使用示例:

const onInputChange = debounce((value) => {
	console.log(value);
}, 500);

document.querySelector("#input").addEventListener("input", (event) => {
	onInputChange(event.target.value);
});

 

优点:

(1)防抖可以避免频繁地触发回调函数,在一定程度上提高代码效率。

(2)可以控制事件的触发频率,防止因用户操作过快导致的不必要的请求或计算。

 

缺点:

(1)因为防抖需要等待一段时间后才执行回调函数,所以可能会导致事件响应的延迟。

(2)如果用户的操作速度过快,可能会出现连续多次触发同一个回调函数的情况。

 

适用场景:

 (1)按钮点击防止重复提交:在用户提交表单或执行某个操作时,避免用户多次点击按钮造成的重复提交或错误操作。

(2)输入框搜索提示搜索内容:在用户输入关键字进行搜索时,等待一段时间后再触发搜索操作,避免因用户输入过快而导致的不必要的网络请求或计算。(如果需要在用户输入完毕后立即搜索,则需要使用防抖。)

(3)浏览器窗口大小调整事件:在浏览器窗口大小改变时,延迟一段时间再重新计算页面布局,避免因窗口大小变化频繁触发回调函数而导致性能下降。

(4)滚动加载数据:在用户滚动页面时,等待一段时间再加载新的数据,以提高页面性能和用户体验。

(5)鼠标移入/移出事件:在鼠标移入或移出某个区域时,延迟一段时间后再触发相应的回调函数,避免因鼠标频繁移动而导致的回调函数频繁触发。

 

 

节流(Throttle)

 

节流是指在一段时间内最多执行一次回调函数。它通常用于操作会导致资源占用或消耗较大的情况,比如页面滚动、鼠标移动等。

function throttle(func, delay) {
	let lastTime = 0;
	return function (...args) {
		const nowTime = Date.now();
		if (nowTime - lastTime >= delay) {
			func.apply(this, args);
			lastTime = nowTime;
		}
	};
}

 

使用示例:

const onScroll = throttle(() => {
	console.log("scroll");
}, 500);

window.addEventListener("scroll", onScroll);

 

优点:

(1)可以减少回调函数的执行次数,避免大量不必要的计算或渲染操作。

(2)在一定程度上可以控制事件的触发频率,避免因用户操作过于频繁而导致的浏览器卡顿或崩溃。

 

缺点:

(1)节流的实现方式可能会导致事件响应的延迟,特别是在设置延迟时间较长时。

(2)如果延迟时间设置过短,可能会导致回调函数被频繁调用,降低代码效率。

 

适用场景:

(1)动态加载数据,限制用户滚动事件触发的频率。

(2)上传文件,限制上传过程中进度条更新的频率。

(3)频繁的 DOM 操作:在用户频繁触发 DOM 操作时,限制操作的执行速率,避免因过快地操作而导致性能下降。

(4)监听滚动事件:在用户滚动页面时,只触发每隔一段时间的回调函数,避免因滚动事件频繁触发而导致性能下降。

(5)监听鼠标移动事件:在用户鼠标移动时,只触发每隔一段时间的回调函数,避免因鼠标移动事件频繁触发而导致性能下降。

更多适用场景

(6)搜索栏输入提示:在用户输入搜索关键字后,只触发每隔一定时间的搜索提示函数,避免因用户输入过快而导致的不必要的网络请求或计算。

(7)限制函数触发次数:在需要控制函数被频繁触发的情况下,可以将函数的触发次数限制在一定范围内,以免影响性能。

(8)频繁的 AJAX 请求:在用户频繁触发 AJAX 请求时,限制请求的执行速率,避免因过快地请求而导致性能下降。

(9)监听键盘输入事件:在用户敲击键盘时,只触发每隔一段时间的回调函数,避免因键盘输入事件频繁触发而导致性能下降。

(10)页面元素动画效果:在实现页面元素的动画效果时,设置一定的时间间隔来控制动画的播放速率,以保证动画效果的流畅度。

(11)窗口 resize 事件:在浏览器窗口大小改变时,只触发每隔一定时间的回调函数,避免因窗口大小变化频繁触发回调函数而导致性能下降。

(12)实现类似于打字机效果的动态文本显示:在将文本逐字逐句地显示时,设置一定的时间间隔来控制文本的显示速率,以提高交互体验。

(13)实现图片懒加载:在滚动页面时,只触发每隔一定时间的回调函数,避免因滚动事件频繁触发而导致性能下降。

(14)实现拖拽功能:在实现拖拽效果时,设置一定的时间间隔来控制拖拽的速率,以保证拖拽效果的流畅度。

(15)防止重复提交:在用户进行重要操作时,如表单提交、支付等,限制操作的执行速率,避免因过快地操作而导致错误或异常行为。

(16)监听鼠标滚轮事件:在用户滚动鼠标滚轮时,只触发每隔一定时间的回调函数,避免因鼠标滚轮事件频繁触发而导致性能下降。

(17)限制用户登录失败次数:在用户登录失败时,限制其再次登录的速率,避免恶意攻击或暴力破解密码。

(18)监听浏览器网络状态:在检测浏览器网络状态时,只触发每隔一定时间的回调函数,避免因频繁检测而导致性能下降。

(19)实现无限滚动功能:在实现无限滚动效果时,设置一定的时间间隔来控制请求数据的速率,以避免过快地请求数据而导致页面的卡顿或崩溃。

(20)监听窗口滚动事件:在用户滚动窗口时,只触发每隔一定时间的回调函数,避免因窗口滚动事件频繁触发而导致性能下降。

(21)实现自动保存功能:在实现自动保存功能时,设置一定的时间间隔来控制保存的速率,以避免过于频繁地保存数据而导致性能下降。

(22)实现在线聊天功能:在实现在线聊天功能时,设置一定的时间间隔来控制消息发送的速率,以保证消息的流畅和稳定。

等等

 

 

防抖和节流注意事项

1、防抖和节流具体使用哪种方法需要根据实际情况来决定。如果需要限制操作速率,则需要使用节流;如果需要等待一定时间后再触发回调函数,则需要使用防抖。

2、尽管节流和防抖可以有效地提升性能和用户体验,但使用不当也会造成负面效果。在选择使用节流和防抖时,需要根据实际情况进行合理的选择,并对其进行合理的配置和调整。

- THE END -
Tag:

半梦半醒丶

3月07日20:17

最后修改:2023年3月7日
0

非特殊说明,本博所有文章均为博主原创。