防抖與節(jié)流

防抖與節(jié)流放可,其實是控制事件觸發(fā)頻率的方法。

在網(wǎng)頁的實際運(yùn)行的某些場景下茫叭,有些事件會持續(xù)被觸發(fā)酬屉,比如resize不是我們需要的滾動一次,觸發(fā)一次揍愁;由于頻繁的DOM操作與資源加載呐萨,嚴(yán)重影響了網(wǎng)頁性能,甚至?xí)斐蔀g覽器崩潰莽囤。

應(yīng)用場景主要有:輸入框持續(xù)輸入垛吗,輸入內(nèi)容遠(yuǎn)程校驗,多次觸發(fā)點擊事件烁登,onScroll等怯屉。


一.防抖

抖動,即執(zhí)行饵沧。一般的抖動都是持續(xù)锨络,多次的。如果函數(shù)持續(xù)多次執(zhí)行狼牺,或許不是想要的效果羡儿。我們更希望讓它冷靜下再執(zhí)行梧兼。即當(dāng)持續(xù)觸發(fā)事件的時候裂允,函數(shù)時完全不執(zhí)行的粹胯,等到最后觸發(fā)結(jié)束后的一段時間再執(zhí)行挨措。


比如:在輸入框進(jìn)行輸入操作時,每次輸入之后都有聯(lián)想詞彈出鼎文,這個控制聯(lián)想詞的方法就需要是結(jié)束輸入后一段時間才觸發(fā)槽棍。

應(yīng)用場景:

實時搜索冀自,拖拽弹囚,登錄信息格式驗證等厨相。


此時需求:

(1)持續(xù)觸發(fā)不執(zhí)行;

(2)不觸發(fā)則隔段時間后執(zhí)行

可以很快想到利用setTimeout鸥鹉,調(diào)用要執(zhí)行的函數(shù)蛮穿,傳入arguments

首先封裝一個函數(shù),讓持續(xù)觸發(fā)的事件監(jiān)聽是封裝的這個函數(shù)毁渗,將目標(biāo)函數(shù)作為回調(diào)函數(shù)傳進(jìn)來践磅,等待一段時間過后執(zhí)行目標(biāo)函數(shù)(fun)

代碼如下:


其次,第一個需求還沒有實現(xiàn)灸异,要如何持續(xù)觸發(fā) 不執(zhí)行府适?此時持續(xù)觸發(fā)時不能有setTimeout,所以在事件持續(xù)觸發(fā)時清除定時器即可幻碱。

代碼如圖所示,當(dāng)事件持續(xù)觸發(fā)時细溅,清除定時器,setTimeout就不會執(zhí)行了儡嘶。


防抖

二.節(jié)流

節(jié)流喇聊,即讓函數(shù)有節(jié)制地執(zhí)行,而非毫無節(jié)制觸發(fā)一次執(zhí)行一次蹦狂。

而有節(jié)制地執(zhí)行誓篱,就是在一段時間內(nèi),只執(zhí)行一次凯楔。

即:一個函數(shù)只有在超過執(zhí)行周期時才執(zhí)行窜骄,周期內(nèi)調(diào)用不執(zhí)行。

應(yīng)用場景:

窗口調(diào)整摆屯,頁面滾動邻遏,搶購操作等。

在購物網(wǎng)站搶購虐骑,總會不斷點擊鼠標(biāo)准验,這時有一段時間點擊鼠標(biāo)是不起作用的,即不會產(chǎn)生效果廷没,這里就是運(yùn)用了節(jié)流糊饱,防止點擊太快產(chǎn)生bug。


分析此時的需求:
(1)持續(xù)觸發(fā)不會執(zhí)行多次

(2)到一定時間再執(zhí)行

這里劃重點:執(zhí)行的時間

所以要想控制執(zhí)行的時間颠黎,可以通過一個開關(guān)另锋,結(jié)合setTimeout。

持續(xù)觸發(fā)不執(zhí)行時狭归,開關(guān)狀態(tài)為關(guān)閉夭坪;

到一定時間,開關(guān) 打開过椎,函數(shù)執(zhí)行台舱。

代碼實現(xiàn)如下:

如果開關(guān)是關(guān)閉的,直接不執(zhí)行潭流。


節(jié)流

或者可以通過使用時間間隔來控制竞惋,記錄上一次函數(shù)的執(zhí)行時間(prev),與當(dāng)前時間(now)作比較灰嫉,如果時間差大于特定值(wait)拆宛,就執(zhí)行。

代碼實現(xiàn)如下:


節(jié)流v2.0

總結(jié)

二者區(qū)別:發(fā)生持續(xù)觸發(fā)事件時讼撒,防抖設(shè)置事件延遲并在空閑時間觸發(fā)事件浑厚;節(jié)流則是隔一段時間觸發(fā)一次股耽。

相同點:防抖與節(jié)流都使用了setTimeout,以此來控制函數(shù)執(zhí)行的時間钳幅。

優(yōu)點:提高性能物蝙,不會出現(xiàn)多次觸發(fā)而導(dǎo)致頁面卡頓的情況。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敢艰,一起剝皮案震驚了整個濱河市诬乞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钠导,老刑警劉巖震嫉,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異牡属,居然都是意外死亡票堵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門逮栅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悴势,“玉大人,你說我怎么就攤上這事措伐⊥郑” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵废士,是天一觀的道長叫潦。 經(jīng)常有香客問我,道長官硝,這世上最難降的妖魔是什么矗蕊? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮氢架,結(jié)果婚禮上傻咖,老公的妹妹穿的比我還像新娘。我一直安慰自己岖研,他們只是感情好卿操,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著孙援,像睡著了一般害淤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拓售,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天窥摄,我揣著相機(jī)與錄音,去河邊找鬼础淤。 笑死崭放,一個胖子當(dāng)著我的面吹牛哨苛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播币砂,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼建峭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了决摧?” 一聲冷哼從身側(cè)響起亿蒸,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜜徽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體票摇,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拘鞋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矢门。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盆色。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖祟剔,靈堂內(nèi)的尸體忽然破棺而出隔躲,到底是詐尸還是另有隱情,我是刑警寧澤物延,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布宣旱,位于F島的核電站,受9級特大地震影響叛薯,放射性物質(zhì)發(fā)生泄漏浑吟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一耗溜、第九天 我趴在偏房一處隱蔽的房頂上張望组力。 院中可真熱鬧,春花似錦抖拴、人聲如沸燎字。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽候衍。三九已至,卻和暖如春洒放,著一層夾襖步出監(jiān)牢的瞬間脱柱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工拉馋, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留榨为,地道東北人惨好。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像随闺,于是被迫代替她去往敵國和親日川。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354