函數(shù)節(jié)流與防抖防抖

函數(shù)的節(jié)流與防抖

概念

  • 事件頻繁觸發(fā)可能造成的問題?
    • 一些瀏覽器事件:window.onresize、window.mousemove等异雁,觸發(fā)的頻率非常高,會(huì)造成界面卡頓
    • 如果向后臺(tái)發(fā)送請(qǐng)求僧须,頻繁觸發(fā)纲刀,對(duì)服務(wù)器造成不必要的壓力
  • 如何限制事件處理函數(shù)頻繁調(diào)用
    • 函數(shù)節(jié)流
    • 函數(shù)防抖
  • 函數(shù)節(jié)流(throttle)
    • 理解:
      • 在函數(shù)需要頻繁觸發(fā)時(shí): 函數(shù)執(zhí)行一次后,只有大于設(shè)定的執(zhí)行周期后才會(huì)執(zhí)行第二次
      • 適合多次事件按時(shí)間做平均分配觸發(fā)
    • 場(chǎng)景:
      • 窗口調(diào)整(resize)
      • 頁面滾動(dòng)(scroll)
      • DOM 元素的拖拽功能實(shí)現(xiàn)(mousemove)
      • 搶購瘋狂點(diǎn)擊(click)
  • 函數(shù)防抖(debounce)
    • 理解:
      • 在函數(shù)需要頻繁觸發(fā)時(shí): 在規(guī)定時(shí)間內(nèi)担平,只讓最后一次生效示绊,前面的不生效。
      • 適合多次事件一次響應(yīng)的情況
    • 場(chǎng)景:
      • 輸入框?qū)崟r(shí)搜索聯(lián)想(keyup/input)

實(shí)現(xiàn)

防抖

function throttle(callback, wait) {
  // 定義開始時(shí)間
  let start = 0
  // 返回一個(gè)函數(shù)
  return function(event) {
    // 獲取當(dāng)前時(shí)間戳
    let now = Date.now()
    // 判斷
    if (now - start >= wait) {
      // 若滿足條件暂论,則執(zhí)行回調(diào)
      callback.call(this, event)
      // 刷新開始時(shí)間
      start = now
    }
  }
}

節(jié)流

function debounce(callback, time) {
  // 定時(shí)器變量
  let timer = null
  // 返回一個(gè)函數(shù)
  return function(event) {
    // 判斷
    if (timer !== null) {
      // 清空定時(shí)器
      clearTimeout(timer)
    }
    // 啟動(dòng)定時(shí)器
    timer = setTimeout(() => {
      // 執(zhí)行回調(diào)
      callback.call(this, event)
      // 重置定時(shí)器
      timer = null
    }, time)
  }
}

測(cè)試

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    body {
      height: 5000px;
    }
  </style>
</head>
<body>
  <input type="text" class="input">

  <script>
    // 節(jié)流測(cè)試
    document.addEventListener('scroll', throttle(function(e) {
      console.log(e)
    }, 500))

    // 防抖測(cè)試
    document.querySelector('.input').addEventListener('keydown', debounce(function(e) {
      console.log(e.target.value)
    }, 1000))
  </script>
</body>
</html>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末面褐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子取胎,更是在濱河造成了極大的恐慌展哭,老刑警劉巖湃窍,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異匪傍,居然都是意外死亡您市,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門役衡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茵休,“玉大人,你說我怎么就攤上這事手蝎¢泡海” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵棵介,是天一觀的道長(zhǎng)钉鸯。 經(jīng)常有香客問我,道長(zhǎng)鞍时,這世上最難降的妖魔是什么亏拉? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮逆巍,結(jié)果婚禮上及塘,老公的妹妹穿的比我還像新娘。我一直安慰自己锐极,他們只是感情好笙僚,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著灵再,像睡著了一般肋层。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上翎迁,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天栋猖,我揣著相機(jī)與錄音,去河邊找鬼汪榔。 笑死蒲拉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痴腌。 我是一名探鬼主播雌团,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼士聪!你這毒婦竟也來了锦援?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤剥悟,失蹤者是張志新(化名)和其女友劉穎灵寺,沒想到半個(gè)月后曼库,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡替久,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年凉泄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躏尉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚯根。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖胀糜,靈堂內(nèi)的尸體忽然破棺而出颅拦,到底是詐尸還是另有隱情,我是刑警寧澤教藻,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布距帅,位于F島的核電站,受9級(jí)特大地震影響括堤,放射性物質(zhì)發(fā)生泄漏碌秸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一悄窃、第九天 我趴在偏房一處隱蔽的房頂上張望讥电。 院中可真熱鬧,春花似錦轧抗、人聲如沸恩敌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纠炮。三九已至,卻和暖如春灯蝴,著一層夾襖步出監(jiān)牢的瞬間恢口,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工穷躁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耕肩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓折砸,卻偏偏與公主長(zhǎng)得像看疗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子睦授,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 函數(shù)節(jié)流 函數(shù)節(jié)流两芳,throttle:某個(gè)函數(shù)在特定時(shí)間段內(nèi)只執(zhí)行第一次,周而復(fù)始去枷,直到指定時(shí)間段結(jié)束怖辆。 節(jié)流是在...
    hellomyshadow閱讀 240評(píng)論 0 1
  • 前言 事件的觸發(fā)權(quán)很多時(shí)候都屬于用戶是复,有些情況下會(huì)產(chǎn)生問題:1.向后臺(tái)發(fā)送數(shù)據(jù),用戶頻繁觸發(fā)竖螃,對(duì)服務(wù)器造成壓力2....
    smallTigerZ閱讀 276評(píng)論 0 0
  • 前言 事件的觸發(fā)權(quán)很多時(shí)候都屬于用戶淑廊,有些情況下會(huì)產(chǎn)生問題: 向后臺(tái)發(fā)送數(shù)據(jù),用戶頻繁觸發(fā)特咆,對(duì)服務(wù)器造成壓力 一些...
    浪里行舟閱讀 1,333評(píng)論 0 10
  • 前言 瀏覽器中某些計(jì)算和處理要比其他的昂貴很多季惩。例如DOM操作比DOM交互需要更多的時(shí)間和cpu時(shí)間,為了提升性能...
    蛙哇閱讀 1,230評(píng)論 0 0
  • 什么是函數(shù)節(jié)流與函數(shù)防抖腻格? 舉個(gè)例子画拾,我們知道目前的一種說法是當(dāng) 1 秒內(nèi)連續(xù)播放 24 張以上的圖片時(shí),在人眼的...
    李輕舟閱讀 1,295評(píng)論 0 11