專案中遇到乙個需要實現文字拖動的效果,用mousedown、mousemove、mouseup模擬拖動效果。但是實現的效果並不是很理想,原因是mousemove是乙個高頻事件,觸發的頻率非常高,會造成瀏覽器的效能問題。
高頻觸發事件,對執行函式進行節流可以節省瀏覽器資源,以免造成不必要的效能浪費。具體的應用場景有:
以吃雞遊戲為例,假設m416的射速不用函式節流,理論上是無數次,分分鐘秒殺敵軍。而函式節流就是要實現這麼乙個效果——一定時間內,只能有效觸發一次函式,即m416一秒內只能射出x發子彈(射出一次子彈可以理解為有效觸發一次函式)。
沒有**的部落格都是耍流氓,我們以mousemove事件為例來看看函式節流的威力。
執行的結果如圖:
可以看出每秒觸發60次左右move事件,拖動的過程會高頻觸發函式,好比絕地求生的m416,你讓它每秒射10000發子彈,槍它受不了啊。為了讓槍受得了,我們規定你只能10ms來一發,**如下:
我們規定每50ms內只能執行一次函式,理論上1秒內可以觸發20次,但由於手動操作,滑鼠移動速度不可能無限快,會造成部分時間損耗。但這都不是重點,重點是我們已經可以控制move的觸發頻率了。一秒觸發15次左右,相比60次可以大幅度節省瀏覽器資源。
既然介紹到函式節流,那麼函式防抖想必也是要介紹的,下期再介紹吧。
Javascript效能優化之 函式節流技術
函式節流技術的主要思路是,通過乙個定時器,阻斷連續重複的函式呼叫。對於我們自己內部使用的函式,這通常意義不大,也不推薦使用這個技術,它可能會丟失對某些資料的處理。但是對於在使用者介面呼叫的函式,卻非常有意義。例如乙個 mousemove 或者ie 中resize 事件的監聽函式。這類事件監聽函式往往...
js效能優化之函式節流 分流函式
比如我們在window.onresize事件中要列印當前瀏覽器視窗的大小,在我們通過拖拽來改變視窗大小時候,列印視窗大小這個工作1s就執行了10次。而實際上我們只需要2次或者3次。比如這行 window.onresize function 實現的思路就是將即將被執行的函式用settimeout延遲一...
javascript函式節流
應用場景 實時輸入檢測 如根據使用者輸入文本來實時查詢資料 判斷註冊使用者名稱是否重複 郵箱格式檢驗 頁面滾動操作onscroll事件 頁面視窗大小改變onresize事件 滑鼠移入移出事件onmouseover,onmouseout 對於以上高頻率的執行操作來說如果不進行節流控制的話,一旦請求頻繁...