Vue手寫防抖和節(jié)流函數(shù)代碼詳解
1. 手寫防抖debounce
首先介紹一個防抖的應用場景。假如需要監(jiān)聽一個輸入框在輸入文字后觸發(fā)的change事件,那么通過keyup事件,每次輸入文字后都會觸發(fā)change事件,頻繁觸發(fā)的情況會影響系統(tǒng)的性能。因此可以使用防抖來降低觸發(fā)頻率,即在用戶輸入結束或暫停時,才會觸發(fā)change事件。
<script>
const input1 = document.getElementById('input1')
// 封裝的防抖函數(shù)
function debounce(fn, delay = 500){
let timer = null
return function(){
if(timer){
clearTimeout(timer)
}
timer = setTimeout(()=>{
fn.apply(this, arguments)
timer = null
}, delay)
}
}
// 調用防抖函數(shù)
input1.addEventListener('keyup', debounce(function(){
console.log(input1.value)
}, 1000))
</script>在輸入框中輸入內容后 1s 才會觸發(fā)事件監(jiān)聽里面的打印功能。

2. 手寫節(jié)流throttle
與防抖在一段時間之后觸發(fā)事件不同,節(jié)流會以固定頻率觸發(fā)事件。下面介紹一個節(jié)流的應用場景,假如在拖拽一個元素時,需要隨時拿到該元素當前被拖拽到的位置,如果直接使用drag事件,那么會頻繁觸發(fā)該事件,很容易卡頓。此時可以使用節(jié)流,即無論拖拽速度有多快,都可以設置固定的頻率觸發(fā)。
<body>
<div id="div1" draggable="true">可拖拽</div>
<script>
const div1 = document.getElementById('div1')
// 封裝節(jié)流函數(shù)
function throttle(fn, delay = 500){
let timer = null
return function(){
if(timer){
return
}
timer = setTimeout(()=>{
fn.apply(this, arguments)
timer = null
}, delay)
}
}
// 在事件監(jiān)聽里面調用節(jié)流函數(shù)
div1.addEventListener('drag', throttle(function(e){
console.log(e.offsetX, e.offsetY)
}, 1000))
</script>
</body>
隨著元素被拖拽,本來應該迅速觸發(fā)拖拽事件打印元素的坐標位置,然而使用節(jié)流將打印元素位置的函數(shù)封裝之后,就會以每隔1000ms的頻率,打印坐標位置。

到此這篇關于JavaScript手寫防抖和節(jié)流函數(shù)代碼詳解的文章就介紹到這了,更多相關JS防抖和節(jié)流內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用vue-aplayer插件時出現(xiàn)的問題的解決
這篇文章主要介紹了使用vue-aplayer插件時出現(xiàn)的問題的解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03

