js節流防抖

2021-10-05 17:53:31 字數 2834 閱讀 2110

什麼是節流防抖?在學習這個問題前,我們先丟擲問題:

假設我現在有這麼乙個需求:根據input框輸入內容列印到控制台
這個問題簡單啊,很簡單的功能嘛,**如下:

"text" id=

"input"

>

let input = document.

getelementbyid

('input'

) input.

addeventlistener

('keyup'

,function()

)<

/script>

<

/body>

沒錯,這樣確實實現了對輸入框進行監聽,但是。。。。這個觸發事件的頻率太頻繁了吧,僅僅輸入6個漢字,居然觸發了這麼多次keyup事件,並且我希望列印出的也只是當我停止或暫停輸入內容時,所列印的內容。

上述**僅僅是用於列印輸入框的值,如果我需要根據輸入框的值向後台傳送ajax請求呢,這麼頻繁的傳送請求,那得多傳送多少次請求啊,那有沒有什麼辦法,可以指定當我停止輸入超過1s後再列印log或者是傳送ajax請求呢?

那就要用到settimeout定時器了,我們給定時器乙個延遲,只有停止輸入1s後才觸發某種邏輯,**如下

"text" id=

"input"

>

let input = document.

getelementbyid

('input'

)// 定義乙個定時器物件,settimeout()返回的是乙個定時器的id

let timerid =

null

// 給input輸入框繫結keyup鍵盤鬆開事件

input.

addeventlistener

('keyup'

,function()

timerid =

settimeout

(function()

,1000)}

)<

/script>

<

/body>

此時結果如下:

只有當你超過1000ms時,才會去執行定時器中的邏輯,同時因為我們有對定時器做清除,所以即便停止輸入超過1s,當我們再次輸入停止時,依舊可以出發當前定時器。

在觸發事件時,我們並不立即執行邏輯,而是給出乙個預定值,只有當預定值到來我們才執行邏輯,我們稱之為防抖。但是上面的**,沒有經過封裝,還無法做到重複使用,下面我們進行一次封裝,**如下:

function

debounce

(fn,delay=

500)

timerid =

settimeout((

)=>

,delay)}}

// 呼叫時

input.

addevent

('keyup'

,debounce

(function()

,1000))

// 如果又有input2輸入框

input2.

addeventlistener

('keyup'

,debounce

(function()

))

回顧上面的防抖:它是在指定延時時間之後才執行一次函式

假設現在給某個div元素註冊drag拖拽事件,列印當前元素的位置座標。

但是我想要在可以拖拽的同時每隔100ms列印一次位置呢

#div1

<

/style>

<

/head>

"div1" draggable=

"true"

>可拖拽<

/div>

let div1 = document.

getelementbyid

('div1'

)let timerid =

null

div1.

addeventlistener

('drag'

,function

(e) timerid =

settimeout

(function

(e),

100)})

<

/script>

<

/body>

<

/html>下面依舊是封裝乙個throttle節流函式

function

throttle

(fn,delay=

500)

timerid =

settimeout((

)=>

,delay)}}

div1.

addeventlistener

('drag'

,throttle

(function

(e))

)

這裡有個坑需要注意,定時器那行要使用箭頭函式,否則會報錯,是因為this的指向問題,定時器中的this指向window,所以定時器中使用箭頭函式比較好,但是箭頭函式有相容性問題,需要注意

這裡僅作為我自己的記錄,水平有限

參考:js節流和防抖問題

js防抖節流

第一種 function debounce fn,delay delay 第二種 function debounce fn,delay delay 立即執行就是事件觸發後立即執行,然後超過一段時間沒有觸發事件,執行函式才會被觸發執行 function fn,delay timer settimeou...

JS防抖節流

在事件被觸發n秒後再執行 函式,如果在這n秒內又被觸發,則重新計時。1 使用者在輸入框中連續輸入一串字元後,只會在輸入完後去執行最後一次的查詢ajax請求,這樣可以有效減少請求次數,節約請求資源 2 window的resize scroll事件,不斷地調整瀏覽器的視窗大小 或者滾動時會觸發對應事件,...

js 防抖節流

函式防抖 將幾次操作合併為一此操作進行。原理是維護乙個計時器,規定在delay時間後觸發函式,但是在delay時間內再次觸發的話,就會取消之前的計時器而重新設定。這樣一來,只有最後一次操作能被觸發。應用 搜尋框在輸入稍有停頓時才更新推薦熱詞 function debounce handler,del...