1. 程式人生 > 其它 >(四) js中的防抖和節流

(四) js中的防抖和節流

1. 防抖函式

為什麼需要防抖

先看這樣一個例子: 我們需要根據使用者的輸入來想後臺請求不同的資料

但是如果不設定某種規則, 而是當用戶輸入一個字元就傳送一次請求, 這對於伺服器的壓力無疑是巨大的

    // 需求: 獲取使用者輸入的內容, 並返回相應的結果

    var input = document.querySelector('input')

    function getDate(value) {
      console.log('ajax: ', value);
    }

    input.addEventListener("keyup", function (e) {
      getDate(e.target.value)
    })

那能不能當我們輸入完以後, 再去呼叫請求函式向後臺傳送請求呢?

答案當然是可以的, 其中一種解決方案就是 使用防抖函式


什麼是防抖函式

防抖函式是閉包的一個應用

在事件被觸發n秒後再執行回撥,如果在這n秒內又被觸發,則重新計時

也就是說, 防抖函式設定了這樣一個規則: 我們設定一個定時器, 當事件被觸發後的n秒後, 我們再去執行後續的操作, 比如傳送網路請求, 但是如果在這n秒內, 事件又被觸發一次, 那麼定時器要重新計時, 重新在n秒後再去執行後續操作

舉個例子

我們打遊戲點了回城按鈕 (觸發事件)以後, 要等待10秒 (延時時間)才能進行傳送 (後續操作), 但是如果倒計時在4s的時候, 我們又點選 (倒計時內再次觸發)

了一次回城, 那麼倒計時將重新開始計時, 需要在重新等待10s後才能進行傳送

var input = document.querySelector('input')

function getDate(value) {
  console.log('ajax: ', value);
}


function debounce(callBack, delay) {
  var timer;
  return function (value) {
    if (timer) {
      clearTimeout(timer)
    }
    timer = setTimeout(function () {
      callBack(value)
    }, delay)
  }
}

var debounceInput = debounce(getDate, 1000)
input.addEventListener("keyup", function (e) {
  debounceInput(e.target.value)
})

2. 節流函式

為什麼需要節流

看這樣一個需求: 當我們點選註冊按鈕, 則向伺服器提交表單資訊

// 需求: 點選按鈕, 提交資訊
var btn = document.querySelector('button')

btn.addEventListener('click', function () {
  console.log('提交註冊資訊', new Date());
})

這裡有一個很大的問題, 就是沒有對按鈕的點選事件進行妥善的處理, 導致每點選一次按鈕, 就會發送一次表單提交, 這顯然是不合理的

當然, 我們可以通過禁用來解決, 而這裡我們可以用另外一種思路來解決

那就是 通過節流函式


什麼是節流函式

規定在一個單位時間內,只能觸發一次函式。如果這個單位時間內觸發多次函式,只有一次生效。

簡單理解: 觸發一個事件後, n秒內進行觸發動作, 不會進行事件處理, 而是要等n秒後, 上一個事件處理完成後, 再進行觸發

例子

​ 這次以銀行櫃檯辦理業務為例, 5分鐘辦理一位, 5分鐘之內哪怕後面的人再催, 也無法為其辦理業務, 必須要等5分鐘結束以後, 才能為下一位辦理業務

// 需求: 點選按鈕, 提交資訊, 在3秒內再次點選, 不生效
var btn = document.querySelector('button')

function submit() {
  console.log('提交註冊資訊', new Date());
}

function throttle(callBack, delay) {
  var timer;
  return function () {
    if (!timer) {
      callBack()
      timer = setTimeout(function () {
        timer = null
      }, delay)
    }
  }
}

var throttleBtn = throttle(submit, 3000)
btn.addEventListener('click', function () {
  throttleBtn()
})
僅記錄自己的學習總結,如有錯誤,還請評論指正~