JavaScript函數(shù)防抖動debounce
防抖動簡述
函數(shù)防抖動(debounce):防止在短時間內(nèi)過于頻繁的執(zhí)行相同的任務(wù)。 當(dāng)短時間內(nèi)的頻繁是不必要的時候,就可以考慮去抖動,避免資源浪費,或造成不好體驗。
函數(shù)防抖動的原理,主要是利用一次性定時器,延遲任務(wù)的執(zhí)行,在延遲這段時間內(nèi), 如果任務(wù)再次被觸發(fā),則通過 clearTimeout 銷毀上一次產(chǎn)生的定時器, 因為定時器的被銷毀,之前被延遲執(zhí)行的任務(wù)也會隨之被取消執(zhí)行。 這樣就實現(xiàn)了在一定時間內(nèi),只執(zhí)行一次任務(wù)。這一次的執(zhí)行通常是最后一次的觸發(fā), 因為此前的觸發(fā)因為定時器的銷毀而被取消了。
多次觸發(fā)只執(zhí)行最后一次或許就是和“節(jié)流”概念的區(qū)別?它兩在作用上挺像的,在具體實現(xiàn)上略有不同。 函數(shù)防抖(debounce)是短時間內(nèi)連續(xù)多次觸發(fā),但只執(zhí)行最后一次,即是說將多次執(zhí)行變成了只執(zhí)行最后一次,執(zhí)行次數(shù)減少。 而節(jié)流(throttle)是將短時間的多次執(zhí)行,變成每隔一段時間執(zhí)行一次。
防抖應(yīng)用示例
1.防抖前后示例效果截圖


2.防抖示例完整 demo
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>防抖動 Demo</title>
</head>
<body>
<h1>防抖動 Demo</h1>
<label>
<span>輸入昵稱:</span>
<input oninput="inputChange(event.data)"></input>
</label>
<script>
let timer = null
function inputChange (data) {
// 不做防抖動會頻繁觸發(fā)校驗,例如連續(xù)的輸入兩個字可能會觸發(fā)6-7次,
// 這種頻繁程度可能不是必要的,當(dāng)頻繁不是必要的,那么就是資源的浪費。
// validatePhone(data)
// 防抖處理,連續(xù)正常的輸入同樣的兩個字,只會觸發(fā)一次校驗任務(wù)。
clearTimeout(timer)
timer = setTimeout(() => {
validatePhone(data)
}, 1000)
}
function validatePhone (data) {
let flag = true
const regPhone = /^1\d{10}$/
if (!regPhone.test(data)) {
flag = false
console.log('校驗內(nèi)容:' + data + '。手機號不正確,請輸入1開頭的11位手機號')
}
return flag
}
</script>
</body>
</html>防抖動的應(yīng)用場景
當(dāng)任務(wù)在短時間內(nèi)被頻繁執(zhí)行,而這種頻繁不是必要的,或不是想要的,就可以考慮使用防抖。 下面是一些場景例子:
①監(jiān)聽滾動條實現(xiàn)左側(cè)內(nèi)容和右側(cè)導(dǎo)航關(guān)聯(lián),滾動條的頻繁程度很高, 而這種頻繁程度可能不是我們想要的,此時就可以考慮使用防抖。
例如我在 JavaScript實現(xiàn)內(nèi)容滾動與導(dǎo)航標(biāo)簽互動關(guān)聯(lián)方案中就使用了防抖。
// 監(jiān)聽滾動條
window.addEventListener("scroll", function (e) {
// 防抖動處理
clearTimeout(that.timeout)
this.timeout = setTimeout(() => {
that.activeNavNode(e)
}, 100)
});②表單輸入的一些監(jiān)聽事件,例如 oninput 等。
③一些組件庫的內(nèi)容變化監(jiān)聽,例如 el-tree 的 @check-change 事件, 當(dāng)選擇祖先級的選項時,因為包含了選中其子孫項,@check-change 會被頻繁觸發(fā), 如果這個選項變化關(guān)聯(lián)接口,那么這種頻繁可能不是必要的。
下面是一個示例:
<el-tree
ref="tree"
:data="treeData"
show-checkbox
@check-change="handleCheckChange">
</el-tree>handleCheckChange (data, checked, indeterminate) {
// 簡單的防抖動處理
clearTimeout(this.timeout)
this.timeout = setTimeout(() => {
let checkedKeys = this.$refs.tree.getCheckedKeys()
// 處理相關(guān)業(yè)務(wù),例如根據(jù)選中的條件,觸發(fā)接口查詢
// this.$emit('checkChange', checkedKeys.join(';'))
}, 300)
},④監(jiān)聽瀏覽器窗口變化 window.onresize,例如在 echarts 的應(yīng)用中, 默認瀏覽器窗口大小改變 echarts 視圖布局是不會做響應(yīng)式改變的, 那么就需要通過監(jiān)聽瀏覽器窗口大小改變?nèi)缓笕ブ刂?echarts 實現(xiàn)布局的改變。 實踐發(fā)現(xiàn),調(diào)整一下瀏覽器窗口大小,會非常多次觸發(fā) onresize, 但如果我們也跟著去多次重置 echarts.resize(),這不僅不是必要的, 而且還會造成閃爍頻繁,卡頓等不好的體驗,以及性能浪費。此時適合用防抖動處理。
下面是一個示例:
// 設(shè)備視口大小改變時,重置 echarts
let timer = null
window.onresize = function () {
// 簡單的防抖動處理
clearTimeout(timer)
timer = setTimeout(() => {
console.log(timer)
chart.resize()
}, 500)
}也可以考慮使用閉包的方式,而不必在外面聲明 timer,例如這樣
// 也可以考慮用閉包的方式
window.onresize = this.debounce(() => {
chart.resize()
}, 500)
function debounce (fn, delay = 1000) {
let timer = null
return () => {
if (timer) clearTimeout(timer)
timer = setTimeout(fn, delay)
}
}⑤鼠標(biāo)事件,例如拖拽等的監(jiān)聽等,出于準(zhǔn)確性和及時性, 他們的監(jiān)聽響應(yīng)十分細密,而當(dāng)這種頻繁在業(yè)務(wù)上可能不是必要的,那么也可以考慮使用防抖動技術(shù)。
到此這篇關(guān)于JavaScript函數(shù)防抖動debounce的文章就介紹到這了,更多相關(guān)JS防抖動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 通過實例講解JS如何防抖動
- JavaScript運動框架 解決防抖動問題、懸浮對聯(lián)(二)
- JavaScript中防抖和節(jié)流的區(qū)別及適用場景
- JavaScript中防抖和節(jié)流的實戰(zhàn)應(yīng)用記錄
- JavaScript深入理解節(jié)流與防抖
- JavaScript防抖與節(jié)流的實現(xiàn)與注意事項
- JavaScript的防抖和節(jié)流一起來了解下
- JavaScript中函數(shù)的防抖與節(jié)流詳解
- javascript的防抖和節(jié)流你了解嗎
- 淺談JavaScript節(jié)流與防抖
- 關(guān)于JavaScript防抖與節(jié)流的區(qū)別與實現(xiàn)
- JavaScript防抖與節(jié)流詳解
- JavaScript 防抖和節(jié)流詳解
- JavaScript防抖動與節(jié)流處理
相關(guān)文章
javascript瀑布流式圖片懶加載實例解析與優(yōu)化
這篇文章主要針對javascript瀑布流式圖片懶加載實例進行解析與優(yōu)化,感興趣的小伙伴們可以參考一下2016-02-02
JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹插入節(jié)點、生成二叉樹示例
這篇文章主要介紹了JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹插入節(jié)點、生成二叉樹,結(jié)合實例形式較為詳細的分析了javascript二叉樹相關(guān)概念、定義、節(jié)點插入、遍歷輸出等相關(guān)操作技巧,需要的朋友可以參考下2019-02-02
IE6-IE9使用JSON、table.innerHTML所引發(fā)的問題
這篇文章主要介紹了IE6-IE9使用JSON、table.innerHTML所引發(fā)的問題 ,需要的朋友可以參考下2015-12-12
js中方法重載如何實現(xiàn)?以及函數(shù)的參數(shù)問題
js中沒有辦法直接實現(xiàn)方法重載,但每一個函數(shù)都有一個特殊的參數(shù)arguments,利用它可以實現(xiàn)方法的重載,具體示例如下2013-08-08
22種JavaScript中數(shù)組常用API總結(jié)
在前端開發(fā)中,數(shù)組是一種常見且重要的數(shù)據(jù)結(jié)構(gòu),本文主要介紹了前端中數(shù)組常用的API,包括添加、刪除、截取、合并、轉(zhuǎn)換等操作,希望對大家有所幫助2023-05-05
JavaScript實現(xiàn)煙花特效(面向?qū)ο?
這篇文章主要為大家詳細介紹了JavaScript使用面向?qū)ο缶幊虒崿F(xiàn)煙花特效,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
el-date-picker與el-time-picker的時間格式設(shè)置代碼
這篇文章主要介紹了el-date-picker與el-time-picker的時間格式設(shè)置代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-11-11

