函式的抖動以及節流

2022-05-21 23:30:10 字數 1699 閱讀 9297

優化高頻率執行js**的一種手段,js中的一些事件如瀏覽器的resize、scroll,滑鼠的mousemove、mouseover,input輸入框的keypress等事件在觸發時,會不斷地呼叫繫結在事件上的**函式,極大地浪費資源,降低前端效能。為了優化體驗,需要對這類事件進行呼叫次數的限制。

html一樣比較簡單:

<

input

type

="text"

>

在事件被觸發delay秒後再執行**,如果在這n秒內又被觸發,則重新計時。--->直白:比如click事件,在規定時間內只能執行一次,若多次點選,只執行最後一次;

var input = document.getelementsbytagname('input')[0];

input.onchange = debounce(function

(e) , 2000)

//防抖debounce

function

debounce(fn, delay) , delay)

}}

以上**就是函式防抖,如果直接執行input的onchange事件只要點選回車,就會輸出;使用debounce降低了降低**執行頻率。節省計算資源。這樣在2000內執行一次,若重複點選,這重新計算; 

注意問題:

①timer的作用域,這裡使用**是為了強調timer的作用域;

每隔一段時間,只執行一次函式。---》直白:比如click事件,在規定時間內,就執行一次,其他的點選都是無效的。

解決方法一:定時器節流。

①:利用乙個開關switcht控制點選事件,在用一次性定時器在delay內再恢復

var input = document.getelementsbytagname('input')[0];

input.onchange = throttles(function

(e) , 2000)

//節流throttles

function

throttles(fn, delay) , delay)

fn(this

) }

}

②:通過時間戳延時

//

節流throttles

function

throttles(fn, delay) , delay)

}}

解決方法二:時間戳節流。使用時間來控制,當前時間與之前的時間間隔超過了delay,就可以再次執行

var input = document.getelementsbytagname('input')[0];

input.onchange = throttles(function

(e) , 2000)

//節流throttles

function

throttles(fn, delay)

}

函式防抖的應用場景

連續的事件,只需觸發一次**的場景有:

函式節流的應用場景

間隔一段時間執行一次**的場景有:

參考文章:

此文章是自己的乙個筆記總結,如若有不對的地方或者需要補充的地方,還望提出,謝謝!

抖動與節流

當我們頻繁觸發同乙個事件,如 改變視窗大小 上下滾動滾動條 反覆向輸入框中輸入內容,就會頻繁的向後台傳送請求。直到任務完成時,之前的請求都是多餘的,嚴重影響使用者體驗和伺服器的效能。這種問題就叫抖動 可以在一定時間內監聽是否再次輸入,如果沒有再次輸入則認為本次輸入完成,傳送請求,否則就是判定使用者仍...

前端的抖動與節流

首先 下面 原理 不斷地觸發事件,但是停下來後,只執行一次。即觸發n次function,但只執行最後的一次function。使用場景 滾動 滑鼠移動 window resize 防抖動事件 鍵盤事件keydown keyup 主體 var timer null function debounce f...

js 函式節流 與 防抖動

函式節流 就如同成都搖號買房,前乙個進去選房了,下乙個就要等一段時間。這種策略就很好的解決了,一大波人進去選房,銷售妹妹沒發接待的尷尬局面。應用場景 監聽瀏覽器滾動條,然後觸發函式。普通做法 document.getelementbyid throttle onscroll function 函式節...