function debounce(func, delay) {

高縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
let timer
//當(dāng)前的this是指向window
return function (...args) {
//當(dāng)前的this是指向dom元素
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(() = {
func.apply(this, args)
}, delay)
}
}
例:div id="test"點(diǎn)擊/div
實(shí)現(xiàn)隔3s執(zhí)行一次的操作:
document.getElementById('test').addEventListener('click', debounce(function() {
console.log('執(zhí)行完成之后的動(dòng)作')
}, 3000))
記:事件回調(diào)函數(shù)里的this指向觸發(fā)當(dāng)前事件的DOM元素
1.search搜索聯(lián)想,用戶在不斷輸入值時(shí),用防抖來節(jié)約ajax請(qǐng)求。
2.滾動(dòng)條滾動(dòng)的時(shí)候觸發(fā)事件
1.鼠標(biāo)不斷點(diǎn)擊觸發(fā),mousedown(單位時(shí)間內(nèi)只觸發(fā)一次)
2.上拉觸底加載更多
在輸入框輸入時(shí),要搜索某個(gè)字符串,基于性能考慮,肯定不能用戶沒輸入一個(gè)字符就發(fā)送一次搜索請(qǐng)求,一種方法就是等待用戶停止輸入,比如過了500ms用戶都沒有再輸入,那么就搜索此時(shí)的字符串,這就是防抖;節(jié)流比防抖寬松一些,比如我們希望給用戶一些搜索提示,所以在用戶輸入過程中,沒過500ms就查詢一次相關(guān)字符串,這就是節(jié)流。
防抖的實(shí)現(xiàn)思路:每次觸發(fā)事件時(shí)都取消之前的延時(shí)調(diào)用方法:
節(jié)流的實(shí)現(xiàn)思路:每次觸發(fā)事件時(shí)都判斷當(dāng)前是否有等待執(zhí)行的延時(shí)函數(shù):
應(yīng)用場(chǎng)景: input輸入信息進(jìn)行搜索,如果每敲一個(gè)字符就請(qǐng)求后臺(tái)接口,給后臺(tái)的壓力太大了,所以做好防抖,即讓程序只執(zhí)行最后一次的事件。
為解決該問題,探索到了兩個(gè)解決方案:
直接使用lodash工具庫的debounce方法
參考網(wǎng)址:
應(yīng)用場(chǎng)景: 滾輪滾動(dòng)觸發(fā)事件頻繁,加上延遲可低頻觸發(fā)
看過了上面閉包防抖的寫法,下面閉包節(jié)流的寫法也很好理解了~
所謂防抖,就是指觸發(fā)事件后在 n 秒內(nèi)函數(shù)只能執(zhí)行一次,如果在 n 秒內(nèi)又觸發(fā)了事件,則會(huì)重新計(jì)算函數(shù)執(zhí)行時(shí)間,簡(jiǎn)而言之,防抖就類似回城,打斷就得重新回。
代碼實(shí)現(xiàn)
所謂節(jié)流,就是指連續(xù)觸發(fā)事件但是在 n 秒中只執(zhí)行一次函數(shù)。節(jié)流會(huì)稀釋函數(shù)的執(zhí)行頻率。簡(jiǎn)而言之,節(jié)流就類似技能需要冷卻時(shí)間到了才能用。
代碼實(shí)現(xiàn)
防抖和節(jié)流,這是前端防止用戶頻繁調(diào)用同一個(gè)接口的方法,比如短時(shí)間重復(fù)點(diǎn)擊上傳同一個(gè)文件,短時(shí)間重復(fù)點(diǎn)擊提交同一個(gè)評(píng)論,異步的操作還沒給你帶來反饋,于是你重復(fù)上傳了多個(gè)文件,重復(fù)提交了多個(gè)評(píng)論。
舉例一個(gè)場(chǎng)景:為了例子更加簡(jiǎn)單,我們就用延遲來模擬一個(gè)后端接口返回的過程。
以上是一個(gè)發(fā)表評(píng)論的例子,由于接口一秒后才會(huì)響應(yīng)評(píng)論反饋到界面上。
用戶本意只是發(fā)布一條評(píng)論,但是由于接口需要響應(yīng)時(shí)間,他以為自己的第一次點(diǎn)擊沒有生效于是就多點(diǎn)擊了兩次,結(jié)果顯而易見,就是非用戶本意的發(fā)布了三條一樣的評(píng)論。
我們希望的是用戶不要在請(qǐng)求還在進(jìn)行的時(shí)候,頻繁的重復(fù)發(fā)送請(qǐng)求。這時(shí)候就需要防抖節(jié)流了。
快速點(diǎn)擊幾次,還是只會(huì)發(fā)送一條評(píng)論。
但是缺點(diǎn)就是用戶得到響應(yīng)的時(shí)間更久了,得要算上延遲加上接口的響應(yīng)。
速點(diǎn)擊幾次,還是只會(huì)發(fā)送一條評(píng)論。只有一條請(qǐng)求發(fā)布成功之后,才能夠發(fā)布第二條請(qǐng)求,對(duì)于該場(chǎng)景十分合適。
分享標(biāo)題:javascript防抖,javascript防抖節(jié)流結(jié)合柯里化
轉(zhuǎn)載注明:http://chinadenli.net/article10/dsgdjdo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、云服務(wù)器、、網(wǎng)站制作、定制開發(fā)、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)