將span隱藏的函式 前端效能優化之函式防抖與截流

2021-10-11 20:26:19 字數 2155 閱讀 7595

在前端開發當中,我們都知道有些互動事件,會頻繁觸發。這樣會導致我們的頁面渲染效能,如果頻繁觸發介面呼叫的話,會直接導致伺服器效能的浪費。話不多說,盤它!

我們先簡單列一下

onresize onmousemove onkeydown srcoll onkeyup
這裡我是用鍵盤事件 keyup作為測試

我們先看一段測試用例

const ocount = document.getelementbyid('count');

const oipt = document.getelementbyid('ipt');

let init = 0

oipt.onkeyup = function()

看一下輸入時候的執行效果。

我們不難發現,每次輸入都會觸發事件的執行。如果我們用這樣的方式去檢測:當前使用者輸入的使用者名稱是否可用?如此高頻率的觸發不僅是極大的浪費,而且使用者還沒有輸入完成就檢測,對使用者的提示也不好。應該等使用者輸入完了,我們再去觸發函式,下面我們優化一下:

// 設定乙個預設值 300ms

const ocount2 = document.getelementbyid('count2');

const oipt2 = document.getelementbyid('ipt2');

// 設定乙個預設值 300ms

const debounce = (fn, wait = 300) => , wait)

}}let init2 = 0

oipt2.onkeyup = debounce(function() , 500) //可以自己定義延遲時間間隔

再來看一下比對效果:

可以看到,加了防抖函式之後,當我們在頻繁輸入的時候,函式並沒有執行, 只有在函式指定的間隔內(500ms)不再輸入了,才會執行函式。如果在時間間隔之內繼續輸入,會觸發函式重新計數。

函式防抖的概念:在事件觸發後的n秒之後,再去執行真正需要執行的函式,如果在這n秒之內事件又被觸發,則重新開始計時

也就是說,如果使用者在間隔時間內一直觸發函式,那麼這個防抖函式內部的真正需要執行的函式將永遠無法執行。

那有沒有什麼好點的辦法,讓使用者在輸入過程中,既能觸發真實需要的函式,又能達到優化的效果?答案是肯定的,那就是:

事例**如下

const ocount3 = document.getelementbyid('count3');

const oipt3 = document.getelementbyid('ipt3');

const otime = document.getelementbyid('time');

const throttle = (fn, threshhold = 1000) => , threshhold)

} else

}}let init3 = 0

const throttleipt = throttle(function() , 1000) // 初始化一下

oipt3.onkeyup = function()

由於我們設定的時間間隔是1000ms也就是1s。我來看一下優化效果:(注意看呼叫次數和時間上秒的變化)

可以看到,任由我們怎麼輸入,函式會按照我們設定的時間(1s),每秒執行一次。你可以設定更大。

他們之間的優缺點,等我下次總結吧!

下面 的你值得擁有:

沈志勇說

前端效能優化之函式防抖與截流

在前端開發當中,我們都知道有些互動事件,會頻繁觸發。這樣會導致我們的頁面渲染效能,如果頻繁觸發介面呼叫的話,會直接導致伺服器效能的浪費。話不多說,盤它!我們先簡單列一下 onresize onmousemove onkeydown srcoll onkeyup這裡我是用鍵盤事件 keyup作為測試 ...

js效能優化之函式節流 分流函式

比如我們在window.onresize事件中要列印當前瀏覽器視窗的大小,在我們通過拖拽來改變視窗大小時候,列印視窗大小這個工作1s就執行了10次。而實際上我們只需要2次或者3次。比如這行 window.onresize function 實現的思路就是將即將被執行的函式用settimeout延遲一...

Dom效能優化之 函式的防抖節流

我們為什麼要用防抖節流?首先我們要知道防抖節流是用來做什麼的。瀏覽器中的某些計算和處理要比其他的昂貴得多,當我們試圖用dom操作html頁面時,如果是進行很多頻繁的dom操作,這很可能導致瀏覽器掛起,甚至崩潰。在ie中使用 onresize事件時容易發生這種情況,我們有必要控制js的執行次數,這時候...