Debounce & Throttle Function
2017年8月30日
一般綁定 DOM 事件(resize
、scroll
、mousemove
和keydown/keyup/keypress
等)的時候,常常會因為事件觸發的太頻繁而導致網頁效能低落。
所以我們可以在事件要執行前加一個控制器,降低事件的觸發頻率,最常使用的就是debounce
和 throttle
這兩個方法,兩者都是用來控制某個事件在一定時間內執行多少次數,看起來非常相似但又有些不同。
Debounce
用戶停止某個操作一段時間之後才執行相應的監聽事件
例如,調整瀏覽器視窗大小的時候,會觸發很多次 resize
事件,可以使用 debounce 方法在停止調整視窗大小的時候在去觸發相應功能。
造輪子
觸發 -> 記錄觸發時間 -> 上次動作觸發時間大於限制時間 -> 執行動作
1 | /** |
參數
immediate
,設定函數在一個時間區間的最開始(true
)執行,還是最後(false
)執行。
呼叫方式
1 | var handleScroll = debounce(function() { |
Throttle
控制監聽事件固定在每 X 毫秒內執行一次
例如,不管滑鼠移動(mousemove
事件)的速度多快,固定在每 250ms 執行一次。
造輪子
觸發 -> 上次動作執行時間大於限制時間 -> 執行動作,記錄執行時間
1 | /** |
呼叫方式
1 | var handleScroll = throttle(function() { |
使用 Underscore.js 中的 _.debounce
和 _.throttle
不想重新造輪子的話可以直接使用 Underscore 或 Lodash。
另外可以使用 Lodash
的指令列工具,產生只有 _.debounce
和 _.throttle
的壓縮檔。
1 | npm i -g lodash-cli |
呼叫方式
1 | $(window).on('scroll', _.debounce(doSomething, 250)); |