在JavaScript中實(shí)現(xiàn)防抖和節(jié)流的方法詳解
下面給你最常用、最標(biāo)準(zhǔn)、直接可復(fù)制的防抖 & 節(jié)流實(shí)現(xiàn),附帶使用示例,一看就會(huì)。
1. 防抖(Debounce)
原理:頻繁觸發(fā)時(shí),只在最后一次觸發(fā)后延遲執(zhí)行,中間全部忽略。
最簡(jiǎn)實(shí)現(xiàn)
function debounce(fn, delay = 300) {
let timer = null;
return function (...args) {
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, args);
}, delay);
};
}
使用示例(搜索框)
const onSearch = debounce((value) => {
console.log("請(qǐng)求搜索:", value);
}, 500);
input.addEventListener("input", (e) => {
onSearch(e.target.value);
});
2. 節(jié)流(Throttle)
原理:固定時(shí)間內(nèi)只執(zhí)行一次,不管觸發(fā)多頻繁。
時(shí)間戳版(立即執(zhí)行,更常用)
function throttle(fn, interval = 300) {
let lastTime = 0;
return function (...args) {
const now = Date.now();
if (now - lastTime >= interval) {
fn.apply(this, args);
lastTime = now;
}
};
}
使用示例(滾動(dòng))
const handleScroll = throttle(() => {
console.log("滾動(dòng)位置", window.scrollY);
}, 300);
window.addEventListener("scroll", handleScroll);
3. 帶立即執(zhí)行的防抖(可選)
有些場(chǎng)景希望第一次立即執(zhí)行,后面再防抖:
function debounceImmediate(fn, delay = 300) {
let timer = null;
return function (...args) {
const isFirst = !timer;
clearTimeout(timer);
timer = setTimeout(() => {
timer = null;
}, delay);
if (isFirst) {
fn.apply(this, args);
}
};
}
4. 快速記憶
- 防抖:等你停手再執(zhí)行 → 搜索框、輸入驗(yàn)證、按鈕防重復(fù)點(diǎn)擊
- 節(jié)流:冷卻時(shí)間 → 滾動(dòng)、拖拽、resize、高頻點(diǎn)擊
需要我給你寫一個(gè)帶取消功能、支持立即執(zhí)行、兼容 React 的高級(jí)版防抖節(jié)流嗎?
以上就是在JavaScript中實(shí)現(xiàn)防抖和節(jié)流的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于JavaScript實(shí)現(xiàn)防抖和節(jié)流的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
js獲取光標(biāo)位置和設(shè)置文本框光標(biāo)位置示例代碼
本實(shí)例描述了如何用Javascript來(lái)控制和獲取文本框/文本域的鼠標(biāo)光標(biāo)位置,以下代碼兼容IE和Chrome,F(xiàn)irefox,大家參考使用吧2014-01-01
JavaScript實(shí)現(xiàn)網(wǎng)頁(yè)計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)網(wǎng)頁(yè)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10
JavaScript實(shí)現(xiàn)煙花特效(面向?qū)ο?
這篇文章主要為大家詳細(xì)介紹了JavaScript使用面向?qū)ο缶幊虒?shí)現(xiàn)煙花特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
微信小程序?qū)崿F(xiàn)倒計(jì)時(shí)補(bǔ)零功能
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)倒計(jì)時(shí)補(bǔ)零功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
TensorFlow.js機(jī)器學(xué)習(xí)預(yù)測(cè)鳶尾花種類
TensorFlow.js是一個(gè)開源的基于硬件加速的JavaScript庫(kù),用于訓(xùn)練和部署機(jī)器學(xué)習(xí)模型。本教程將會(huì)帶大家簡(jiǎn)單了解和使用TensorFlow.js框架實(shí)現(xiàn)預(yù)測(cè)鳶尾花種類2022-11-11
基于Javascript實(shí)現(xiàn)網(wǎng)頁(yè)版的繪圖板
這篇文章主要為大家詳細(xì)介紹了如何基于HTML5 Canvas和jQuery實(shí)現(xiàn)的簡(jiǎn)單網(wǎng)頁(yè)版繪圖編輯器,文中的示例代碼講解詳細(xì),需要的小伙伴可以了解下2024-10-10
Three.js如何用軌跡球插件(trackball)增加對(duì)模型的交互功能詳解
這篇文章主要給大家介紹了關(guān)于Three.js如何用軌跡球插件,也就是trackball增加對(duì)模型的交互功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-09-09

