摘要:所以針對此類事件則需要進行節流,或者防抖動處理。節流判斷是否已空閑,如果在執行中,則直接函數節流二防抖對于一定時間段內的連續的函數調用,只執行一次原理其實就是一個定時器,當我們觸發一個事件時,讓這個事件延遲一會在執行。
在瀏覽器dom事件里面,一些事件會隨著用戶的操作不間斷的觸發,比如:為一個元素綁定拖拽事件,為頁面綁定resize事件(重新調整瀏覽器窗口大小),頁面滾動。如果dom操作比較復雜,還不間斷的觸發事件。這將會造成性能上的損失,導致瀏覽器卡頓,用戶體驗下降。
所以針對此類事件則需要進行節流,或者防抖動處理。
一、節流-throttle在指定時間內,讓函數只觸發一次。
規定一個單位時間,在這個單位時間內,只能有一次觸發事件的回調函數執行,如果在同一個單位時間,觸發了多次的回調函數,那也只有一次能生效,其余的作廢。
舉例:
假設,我們觀察的總時間為10秒鐘,規定1秒作為一次事件的最小間隔時間。
如果觸發事件的頻率是 0.5s/次
因為控制了最多一秒一次,頻率為0.5s/次,所以每一秒鐘就有一次事件作廢。最終控制成1s/次
實現:
第一種:采用loadsh庫的_.throttle()函數 第二種:滑動為例,,我們滾動頁面時,為使用節流函數之前,頻繁觸發了多次的函數調用,函數調用中涉及到了dom操作或者接口請求的話,那將會 進行無數次的函數調用。 采用之后,時間間隔內(這里設置300ms)多次觸發了函數,只執行了一次。二、防抖-debounce節流
對于一定時間段內的連續的函數調用,只執行一次
原理:其實就是一個定時器,當我們觸發一個事件時,setTimeout讓這個事件延遲一會在執行。如果在這個時間段內又觸發了這個事件。那么我們就先clear掉這個定時器,在重新setTimeout一個新定時器來延遲執行。
多次調用之執行一次:
同樣這邊的例子是
假設,我們觀察的總時間為10秒鐘,規定1秒作為一次事件的最小間隔時間。
如果觸發事件的頻率是 0.5s/次
因為始終沒法等一秒鐘就被再次觸發了,所以最終沒有一次事件是成功的。
實現:
第一種:采用loadsh庫的_.debounce()函數 第二種:滑動為例,,我們滾動頁面時,為使用防抖函數之前,頻繁觸發了多次的函數調用,函數調用中涉及到了dom操作或者接口請求的話,那將會 進行無數次的函數調用。 采用防抖之后,只有在停止滑動后,定時結束才執行函數處理邏輯。三、區別防抖
節流:不管事件觸發的多頻繁,都會保證在規定的時間內一定會執行一次真正的事件處理函數。
防抖:只在最后一次觸發事件后才執行一次函數
參考:
https://blog.csdn.net/crystal6918/article/details/62236730
https://juejin.im/post/5a35ed25f265da431d3cc1b1
https://www.jianshu.com/p/b73c2acad696
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94681.html
摘要:今天和別人聊到函數的節流和防抖,發現自己對這兩個的區別很是模糊,遂小小實踐一下,在此記錄,希望對需要的人有所幫助。防抖實現順利,但是兩個節流方法的執行結果存在差異。 今天和別人聊到JavaScript函數的節流和防抖,發現自己對這兩個的區別很是模糊,遂小小實踐一下,在此記錄,希望對需要的人有所幫助。 節流 - 頻繁操作,間隔一定時間去做一件事 舉例說明:假定時間間隔為 500ms,頻繁...
閱讀 4933·2021-11-25 09:43
閱讀 1185·2021-11-24 09:38
閱讀 1892·2021-09-30 09:54
閱讀 2799·2021-09-23 11:21
閱讀 2366·2021-09-10 10:51
閱讀 2368·2021-09-03 10:45
閱讀 1163·2019-08-30 15:52
閱讀 1765·2019-08-30 14:13