前端防抖——避免不必要的請求

一、什麼是前端防抖?

前端防抖指的是在某個時間段內,如果有多個相同事件同時被觸發,只會執行最後一次觸發事件的函數,並且可以設置等待時間,如果在等待時間內有新的事件觸發,就需要重新等待,等待時間結束後才會執行函數。常用於解決重複事件觸發導致的瀏覽器性能問題。

二、前端防抖的應用場景

1、輸入框搜索實時聯想功能:每當用戶輸入一個字元就會發起請求,如果頁面中有多個輸入框,會導致頻繁的請求,使用前端防抖可以減少請求次數。

function debounce(func, delay) {
  let timer;
  return function(...args) {
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

function search() {
  // 實現搜索功能
}

const inputElement = document.querySelector('input');
inputElement.addEventListener('input', debounce(search, 300));

2、頁面滾動懶載入:用戶可能不會看到頁面所有內容,當頁面滾動到某個位置時才會載入一部分內容,如果每滾動一個像素就會發起一次請求,會嚴重影響頁面性能,使用前端防抖可以減少請求次數。

function debounce(func, delay) {
  let timer;
  return function(...args) {
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

function loadContent() {
  // 載入內容
}

window.addEventListener('scroll', debounce(loadContent, 300));

三、前端防抖的實現方式

前端防抖有兩種實現方式,一種是使用setTimeout函數,一種是使用requestAnimationFrame函數,兩種方式都可以有效地避免不必要的請求。

1、使用setTimeout函數實現

function debounce(func, delay) {
  let timer;
  return function(...args) {
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

上面的代碼中,timer表示定時器的編號,當事件觸發時,會先判斷是否有已經存在的定時器,如果有,則清除已有定時器,然後重新設置一個新的定時器,等待一段時間後執行函數。

2、使用requestAnimationFrame函數實現

requestAnimationFrame函數可以在瀏覽器繪製下一幀之前執行任務,可以減少不必要的重繪,從而提高性能。

function debounce(func, delay) {
  let timer;
  return function(...args) {
    if (timer) {
      cancelAnimationFrame(timer);
    }
    timer = requestAnimationFrame(() => {
      func.apply(this, args);
    }, delay);
  };
}

與使用setTimeout函數實現的代碼類似,只是將setTimeout函數替換成了requestAnimationFrame函數。

四、前端防抖的優化方式

前端防抖雖然可以解決頻繁觸發事件的問題,但是如果事件觸發過於頻繁,也會導致大量的請求堆積,影響用戶體驗。為了避免這種情況,可以對前端防抖進行優化。

1、立即執行一次:如果用戶需要立即執行函數,可以在函數執行前加上一個立即執行的代碼塊。

function debounce(func, delay, immediate) {
  let timer;
  return function(...args) {
    if (timer) {
      clearTimeout(timer);
    }
    if (immediate) {
      immediate = false;
      func.apply(this, args);
    }
    timer = setTimeout(() => {
      if (!immediate) {
        func.apply(this, args);
      }
    }, delay);
  };
}

2、取消防抖:如果用戶不需要某個事件的防抖功能,可以取消防抖。

function debounce(func, delay) {
  let timer;
  const debounceFunc = function(...args) {
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
  debounceFunc.cancel = function() {
    clearTimeout(timer);
  };
  return debounceFunc;
}

const inputElement = document.querySelector('input');
const debounceSearch = debounce(function() {
  // 實現搜索功能
}, 300);

inputElement.addEventListener('input', debounceSearch);

// 取消防抖
debounceSearch.cancel();

五、總結

前端防抖是一種常用的優化技術,可以避免不必要的請求,提高網頁的性能和用戶體驗。通過本文的介紹,我們了解了前端防抖的實現方式和優化方式,可以更好地應用於實際開發中。

原創文章,作者:YESBU,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/332735.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
YESBU的頭像YESBU
上一篇 2025-01-27 13:34
下一篇 2025-01-27 13:34

相關推薦

  • 小程序防抖詳解

    一、什麼是小程序防抖 小程序防抖是指在小程序中對於某些用戶操作或者事件的處理過程中,採用一定的技術手段,對於用戶操作過於頻繁的情況進行處理,防止用戶的操作過於頻繁,導致小程序的崩潰…

    編程 2025-04-12
  • 節流防抖詳解及代碼示例

    一、什麼是節流和防抖? 在前端開發中,由於用戶的交互行為導致的頻繁觸發事件會導致瀏覽器的性能問題。我們可以通過使用節流和防抖來限制這種觸發,以提高瀏覽器的性能。 1. 節流 所謂節…

    編程 2025-02-25
  • IDEASVNIGNORE:快速避免不必要的文件上傳

    一、基本概念 IDEASVNIGNORE是一個用來避免上傳不必要的文件到SVN倉庫的高效工具。在使用SVN管理項目時,可能需要將一些本地運行環境需要的配置文件從倉庫中忽略掉,如果每…

    編程 2024-12-31
  • 如何使用HTML轉義符號來避免在頁面中出現不必要的字元

    一、HTML轉義符號的概念 HTML 轉義符號是一些用於將 HTML 語法中的特殊字元轉義成字元實體或者命名實體的字元。這些特殊字元包括HTML中的標籤符號、空格、引號以及其他的一…

    編程 2024-12-25
  • JavaScript防抖函數的詳細解析

    一、js防抖函數怎麼寫 防抖函數的基本思路是在函數觸發時,設定一個計時器來延遲執行函數,若在延時期間函數被再次觸發,則重新計時,直到延時期滿。這個計時器可以使用setTimeout…

    編程 2024-12-12
  • Vue防抖節流詳解

    Vue.js 是一個流行的 JavaScript 框架。但是在處理 DOM 事件的時候,我們可能會遇到一些問題。比如,連續多次點擊某個按鈕會反覆觸發事件,卡頓等問題。這個時候,防抖…

    編程 2024-12-09
  • 小程序防抖的使用與應用

    一、小程序防抖節流 在小程序開發中,防抖和節流是常見的優化方式。防抖可以避免短時間內多次觸發事件,造成影響。而節流可以限制一段時間內觸發的次數,避免頻繁的調用。 我們可以用debo…

    編程 2024-12-02

發表回復

登錄後才能評論