JavaScript 防抖與節流——以游戲智慧解鎖實戰奧秘

在這里插入圖片描述

🔥 個人主頁:空白詩

在這里插入圖片描述

文章目錄

    • 🎮 引言
    • ? 什么是防抖和節流
    • 🏹 防抖(Debounce) - 鎖定追擊,精確無誤
      • 📌 基礎概念
      • 📌 適用場景
      • 📌 實戰代碼:防抖 應用于輸入框的實時搜索
    • 🌀 節流(Throttle) - 技能冷卻,戰略部署
      • 📌 基礎概念
      • 📌 適用場景
      • 📌 實戰代碼:節流 應用于點擊按鈕事件
    • 🏆 結語
    • 🔗 相關鏈接

🎮 引言

在前端開發的實踐里,確保用戶界面流暢且高效是至關重要的。面對諸如窗口滾動、輸入監聽等高頻觸發事件,防抖(Debounce) 節流(Throttle) 技術成為了優化性能、提升用戶體驗的關鍵策略。本篇學習筆記旨在通過直接的概念闡述、詳盡的原理分析及實戰代碼示例(含注釋),幫助你全面掌握這兩種優化方法。🌟

? 什么是防抖和節流

「防抖」(Debounce)和「節流」(Throttle)是兩種在軟件開發中用來優化高性能需求環境下事件處理的技術,主要目的是限制函數的執行頻率,從而減少不必要的計算負擔,提高程序效率,尤其是在處理高頻觸發的事件如用戶輸入、滾動事件或窗口大小調整時。
在這里插入圖片描述


🏹 防抖(Debounce) - 鎖定追擊,精確無誤

📌 基礎概念

「防抖」的核心在于,當一個動作被觸發時,并不立即執行相應函數,而是設置一個延遲(等待)時間。若在這個延遲時間內再次觸發該動作,則重新開始計時,直到延遲時間結束后,函數才會被執行一次。此機制有效避免了因短時間內頻繁操作而造成的資源浪費。

📌 適用場景

「防抖」非常適合用于處理那些用戶連續且快速的操作,如表單的實時驗證、搜索框的自動完成建議。它確保在用戶停止操作后才進行響應,比如鍵盤輸入停止后才發送請求獲取搜索建議,這樣可以避免用戶還在輸入過程中就頻繁發送請求

想象你是游戲中的一名狙擊手,面對快速移動的目標。防抖技能就像是你的高級鎖定系統:一旦發現敵人,你立刻啟動鎖定程序,但敵人如果在你完成鎖定前不斷變換位置,你的瞄準鏡就會不斷調整,重新開始鎖定流程。只有當敵人在一段時間內保持靜止(例如1秒),你的鎖定系統才能最終確定目標位置,發射致命一擊。這樣一來,你確保了每一槍都是在最理想的條件下發射,避免了無謂的資源浪費。🎯

📌 實戰代碼:防抖 應用于輸入框的實時搜索

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Debounce Input Example</title><style>body { font-family: Arial, sans-serif; }#searchInput { width: 300px; padding: 10px; margin-bottom: 10px; }#searchResult { margin-top: 10px; }</style>
</head>
<body><h2>防抖輸入框示例</h2>
<input type="text" id="searchInput" placeholder="嘗試輸入查詢...">
<div id="searchResult">搜索結果將會在這里顯示...</div><script>// 防抖函數function debounce(func, wait) {let timeout;return function(...args) {clearTimeout(timeout);timeout = setTimeout(() => func.apply(this, args), wait);};}// 模擬的搜索處理函數function simulateSearch(query) {console.log(`模擬搜索: "${query}"`);document.getElementById('searchResult').innerText = `模擬搜索結果: "${query}"`;}// 使用防抖的搜索處理const debouncedSearch = debounce(simulateSearch, 300);document.getElementById('searchInput').addEventListener('input', function(e) {debouncedSearch(e.target.value);});
</script></body>
</html>

這段代碼是一個簡單的示例,展示了如何使用防抖(debounce)技術來優化輸入框(input)的實時搜索功能,以減少不必要的搜索請求。下面是對關鍵部分的解析:

HTML結構

  • 頁面包含一個標題<h2>,說明這是防抖輸入框的示例。
  • 一個輸入框<input>,id為searchInput,用戶可以在其中輸入查詢內容。它有一個占位符文本,提示用戶嘗試輸入查詢。
  • 一個<div>元素,id為searchResult,用來顯示模擬的搜索結果。

CSS樣式

  • 頁面整體字體設置為Arial,備選sans-serif,保證良好的可讀性。
  • 輸入框寬度設為300px,內外邊距設置為美觀。
  • 結果展示區域searchResult有一個上外邊距,使其視覺上與輸入框有所區分。

JavaScript邏輯

  1. 防抖函數 (debounce): 這是一個通用的防抖函數實現,接收兩個參數:要執行的函數func和等待時間wait(單位為毫秒)。內部使用了一個timeout變量來跟蹤定時器,每次調用時先清除之前的定時器,然后重新設置,確保在最后一次調用后的wait毫秒后才執行func

  2. 模擬的搜索處理函數 (simulateSearch): 這個函數模擬了實際的搜索處理邏輯,它接收一個參數query,表示用戶的查詢字符串,并在控制臺打印出模擬的搜索信息,同時更新頁面上的searchResult元素的內容,顯示模擬的搜索結果。

  3. 防抖搜索處理應用 : 通過debounce函數包裝simulateSearch函數,得到debouncedSearch。然后,給searchInputinput事件添加了一個事件監聽器,當用戶在輸入框中輸入時,觸發debouncedSearch。這樣,只有當用戶停止輸入超過300毫秒后,模擬的搜索函數才會執行,有效地減少了因快速連續輸入導致的過多搜索請求。

綜上所述,這個示例通過防抖技術提高了搜索功能的效率,減少了不必要的服務器負擔,同時也提升了用戶體驗,因為用戶在連續輸入時不會看到頻繁變化的搜索結果,只有在他們停止輸入足夠長的時間后,才會看到最新的搜索結果。


🌀 節流(Throttle) - 技能冷卻,戰略部署

📌 基礎概念

「節流」則是在指定的時間間隔內,無論觸發多少次事件,都只執行一次預先設定的函數。這意味著,即使事件連續觸發,也會按照固定的頻率來執行回調,從而控制執行頻率,達到資源優化的目的。

📌 適用場景

「節流」適用于那些需要在連續事件中保持一定響應頻率的場景,如滾動事件處理、窗口大小調整時的重繪操作。它可以幫助維持動畫的流暢性,同時避免過度渲染導致的性能損耗

轉換到法師角色,你掌握著一場戰斗中最強大的法術,但每一次釋放都需要巨大的魔力和時間恢復。節流技能就像你的魔法技能冷卻系統:一旦釋放,不論敵人是否已被擊敗,你都需要等待一段冷卻時間(CD)才能再次使用該技能。🔮

📌 實戰代碼:節流 應用于點擊按鈕事件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Throttle Button Click Example</title><style>body { font-family: Arial, sans-serif; }#clickButton { padding: 10px 20px; background-color: #007BFF; color: white; border: none; cursor: pointer; }#clickCount { margin-top: 10px; }</style>
</head>
<body><h2>節流按鈕點擊示例</h2>
<button id="clickButton">點擊我</button>
<div id="clickCount">已點擊次數: 0</div><script>// 節流函數function throttle(func, limit) {let inThrottle, lastExec = 0;return function(...args) {const now = new Date().getTime();if (!inThrottle) {func.apply(this, args);lastExec = now;inThrottle = true;} else if (now - lastExec >= limit) {func.apply(this, args);lastExec = now;}setTimeout(() => inThrottle = false, limit - (now - lastExec));};}let clickCount = 0;// 模擬的點擊處理函數function handleClick() {console.log("按鈕點擊");document.getElementById('clickCount').innerText = `已點擊次數: ${++clickCount}`;}// 使用節流的點擊處理const throttledClick = throttle(handleClick, 1000);document.getElementById('clickButton').addEventListener('click', throttledClick);
</script></body>
</html>

這段代碼展示了一個利用節流(throttle)技術來控制按鈕點擊事件處理的應用實例。下面是對其關鍵部分的解析:

HTML結構

  • 頁面包含一個標題<h2>,說明這是一個節流按鈕點擊的示例。
  • 一個藍色的按鈕<button>,id為clickButton,鼓勵用戶點擊。
  • 一個<div>元素,id為clickCount,初始顯示已點擊次數為0,用于反映點擊處理的結果。

CSS樣式

  • 設置了頁面字體,以及按鈕的樣式,包括背景色、文字顏色、邊框和光標樣式,使得按鈕在視覺上更加吸引人點擊。
  • 為點擊計數的<div>設置了外邊距,保持頁面布局的整潔。

JavaScript邏輯

  1. 節流函數 (throttle): 實現了節流邏輯,接受一個函數func和一個時間間隔limit作為參數。它通過維護一個狀態變量inThrottle來追蹤當前是否在冷卻時間內,以及lastExec記錄上次執行的時間。當函數被調用時,計算自上次執行以來經過的時間,如果不在冷卻期內或已超過指定間隔,則執行函數,并更新最后執行時間。最后設置定時器,在冷卻期結束后重置inThrottle

  2. 點擊計數變量 (clickCount): 初始化為0,用于記錄按鈕被點擊的次數。

  3. 模擬的點擊處理函數 (handleClick): 點擊時被調用的函數,簡單地在控制臺打印“按鈕點擊”,并更新頁面上的點擊次數顯示。

  4. 節流點擊處理應用 : 通過throttle函數包裝handleClick,得到throttledClick,確保該函數在任何連續點擊事件中,至少有1秒的間隔才會執行一次。然后,給按鈕的click事件添加了一個事件監聽器,使用throttledClick作為處理函數。

總結來說,這個示例演示了如何利用節流技術來限制用戶快速連續點擊按鈕時的響應次數,從而避免了因過于頻繁的點擊處理導致的性能問題。用戶點擊按鈕后,至少要等待1秒鐘,計數才會再次增加,這有助于控制頻繁操作帶來的副作用,提升了用戶體驗和應用性能。


🏆 結語

防抖(Debounce)節流(Throttle) 作為前端性能優化的兩種關鍵技術,它們的核心機制及其應用場景如下:

📌 防抖(Debounce)

  • 核心機制:防抖確保一個函數在觸發后的等待期內,若再次被觸發,則重新計算等待時間,僅當所有觸發操作停止后的一段時間內沒有新的觸發,函數才會執行一次。這種方式有效過濾了短時間內連續的重復調用,特別適合于那些不需對每個輸入變化都立即響應的場景,如表單驗證、搜索建議等。
  • 應用場景示例:在實時搜索輸入框中,用戶連續快速輸入字符時,防抖確保只在用戶完成輸入并暫停后發起搜索請求,減少不必要的后臺查詢。

📌 節流(Throttle)

  • 核心機制:節流確保函數在給定的時間間隔內至多執行一次,即使該事件在此期間被觸發多次。它按照固定的頻率執行回調,維持執行的頻率上限,適用于那些需要限制執行速率但仍需保持一定頻率響應的場景。
  • 應用場景示例:滾動事件處理中,使用節流來控制滾動事件的處理邏輯,如加載更多內容或更新滾動位置指示器,以確保即使快速滾動也不會造成處理邏輯的過度執行。

📌 實踐代碼回顧

  • 防抖應用:通過在輸入框的input事件上應用防抖處理,確保在用戶停止輸入后才執行搜索模擬,優化了用戶體驗并減輕了服務器壓力。
  • 節流應用:在按鈕點擊事件上的節流實現,控制了即使用戶快速連續點擊,處理邏輯(如點擊計數)也保持固定間隔執行,防止了不必要的資源消耗。

綜上所述,防抖節流雖機制不同,但目的相同:優化性能、提升用戶體驗。選擇哪種技術取決于具體需求:

  • 若需確保動作停止后再響應,減少無用功,防抖是優選。
  • 若需在頻繁操作中維持穩定頻率執行,而不限制最后執行,節流更為合適。

通過合理應用這兩項技術,開發者能夠構建出響應迅速且資源高效的前端應用,為用戶提供流暢無阻的交互體驗。


🔗 相關鏈接

  • JavaScript 中的 Class 類
  • JavaScript中call、apply與bind的區別
  • JavaScript 垃圾回收機制深度解析:內存管理的藝術
  • 深入淺出JavaScript繼承機制:解密原型、原型鏈與面向對象實戰攻略
  • 深入理解JavaScript事件循環Event Loop:宏任務與微任務的奇幻之旅

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10506.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10506.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10506.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

經濟學博弈論介紹

經濟學博弈論是經濟學的一個重要分支&#xff0c;研究經濟主體之間的策略選擇和互動。博弈論的核心理論框架是“博弈”&#xff0c;即在不確定對方行為的情況下&#xff0c;個體根據自身利益和目標制定策略。 在經濟學博弈論中&#xff0c;個體被稱為“博弈者”&#xff0c;他…

Java基礎入門day48

day48 JDBC調用關系 tomcat 簡介 tomcat是Apache下的一個核心項目&#xff0c;免費開源&#xff0c;支持servlet和jsp。 tomcat技術先進&#xff0c;性能穩定&#xff0c;目前比較流行的web應用服務器 安裝 官網&#xff1a; Apache Tomcat - Welcome! 下載 tomcat8.5 解壓&a…

Linux入門攻堅——23、DNS和BIND基礎入門1

DNS——Domain Name Service&#xff0c;協議&#xff08;C/S&#xff0c;53/udp&#xff0c;53/tcp&#xff09; BIND——Berkeley Internet Name Domain&#xff0c;ISC&#xff08;www.isc.org&#xff09; 互聯網絡上主機之間的通信依靠的是IP&#xff0c;而人或程序一般使…

tailwindcss大綱

布局 css說明地址aspect-ratio用于控制元素縱橫比Aspect Ratio - Tailwind CSSwidth <br />max-widthcontainer&#xff1a;用于將元素的寬度固定到當前斷點的組件Container - Tailwind CSScolumns用于控制元素內列數Columns - Tailwind CSSbreak-after用于控制列或頁在…

通義靈碼企業版正式發布,滿足企業私域知識檢索、數據合規、統一管理等需求

5 月 9 日阿里云 AI 峰會&#xff0c;阿里云智能集團首席技術官周靖人宣布&#xff0c;通義靈碼企業版正式發布&#xff0c;滿足企業用戶的定制化需求&#xff0c;幫助企業提升研發效率。 通義靈碼是國內用戶規模第一的智能編碼助手&#xff0c;基于 SOTA 水準的通義千問代碼模…

基于 element-ui 表格組件 el-table 導出表格數據

方法一&#xff1a;前端處理&#xff0c;直接導出 e-table 組件的表格數據 import XLSX from xlsx;/*** el-table 表格導出* param {*} idSelector id選擇器* param {*} name 導出表格名稱* param {*} remove 表格是否存在左/右固定列&#xff0c;存在則傳入true&#xff0c;反…

在MyBatis中,如何將數據庫中的字符串類型映射為枚舉類型?

在MyBatis中&#xff0c;如何將數據庫中的字符串類型映射為枚舉類型&#xff1f; 網上看了很多教程。說了很多&#xff0c;但是都沒說到重點&#xff01; 很簡單&#xff0c;xml文件中&#xff0c; 使用resultType&#xff0c;而不是使用resultMap就可以了。 resultType"…

用HAL庫改寫江科大的stm32入門例子8-1 DMA數據轉運

實驗1-實驗目的&#xff1a;通過DMA把buffer的數據搬運到buffer2當中。 //declare a buffer to store the data uint32_t buffer[3] {1,2,3};//declare a buffer to store the data uint32_t buffer2[3] {0,0,0}; DMA&#xff1a;是個搬運數據的小助手。 相關設置&#xff1…

Baidu Comate:釋放編碼潛能,革新軟件開發

Baidu Comate Baidu Comate&#xff0c;智能代碼助手&#xff0c;憑借著文心大模型的強大支撐&#xff0c;結合了百度多年的編程實戰數據和豐富的開源資源&#xff0c;形成了一款嶄新的編碼輔助利器。它不僅具備著高智能、多場景、價值創造的特質&#xff0c;更可廣泛應用于各…

實物仿真平臺設計方案:927-8路GMSL視頻注入回灌的自動駕駛半實物仿真平臺

8路GMSL視頻注入回灌的自動駕駛半實物仿真平臺 一、平臺介紹 產品基于8路GMSL視頻注入回灌的自動駕駛半實物仿真平臺旨在提高實驗室及研究生院師生在基礎軟件層開發、計算機視覺和深度學習方面的專業知識學習和實踐能力&#xff0c;為師生提供一個穩定軟件開發和多精度框…

匯編個位數求和實驗

title: 匯編求和實驗 keywords: 匯編 tags: [匯編] categories: 嵌入式 匯編求和實驗 剛開始學習匯編 給大家做個參考 實驗 5 子程序 5.1 實驗目的 ①掌握利用堆棧傳遞參數的子程序調用方法。 ②過程調用偽指令&#xff1a;PROC&#xff0c;ENDP&#xff0c;NEAR和FAR。 ③8088…

神經網絡權重初始化學習

在神經網絡中&#xff0c;權重初始化是一個關鍵步驟&#xff0c;它影響著模型的訓練效率和最終性能。使用正態分布作為初始值是一種常見且有效的策略&#xff0c;尤其是在深度學習中。 原理 為何使用分布初始化&#xff1f; 如果所有權重初始化為相同的值&#xff08;如全零初…

hive日常使用時忘記部分補充(不定時)

1、date_formate、unix_timestamp、from_unixtime用法&#xff1a; 2、lag&#xff08;&#xff09;、lead()用法&#xff1a; lag&#xff08;)窗口函數返回分區中當前行之前行&#xff08;可以指定第幾行&#xff09;的值。 如果沒有行&#xff0c;則返回null。 lead()窗口…

pytest + yaml 框架 - 錄制接口轉 yaml 用例實現

pytest yaml 框架基本不用寫 python 代碼&#xff0c;只需寫yaml 文件用例就能實現接口自動化。 現在引入接口錄制功能&#xff0c;連 yaml 文件也不用寫了&#xff0c;點點點就能生成 yaml 用例文件了。 錄制功能在v1.3.4版本上實現 pip instal pytest-yaml-yoyo 環境準備 …

如何使用 ArcGIS Pro 制作地震動畫

在做某些匯報的時候&#xff0c;除了圖文&#xff0c;如果有動畫肯定會成為加分項&#xff0c;這里為大家介紹一下如何使用 ArcGIS Pro 制作地震動畫&#xff0c;希望能對你有所幫助。 添加時間 在圖層屬性內&#xff0c;選擇時間選項卡&#xff0c;圖層時間選擇每個要素具有…

鎵未來助力聯想筆記本GaN適配器標配化,賦能高效用戶體驗

鎵未來賦能筆記本電腦GaN適配器標配化 據悉&#xff0c;Lenovo 2024年推出搭配的多款新型筆記本原裝適配器電源ADL100UDGC3A&#xff0c;采用了鎵未來集成型Cascode技術氮化鎵功率器件G1N65R150PB。新款方案相較上一代工藝&#xff0c;體積減小23%&#xff0c;重量降低18%&…

秋招算法刷題10(棧和隊列)

0509 232.用棧實現隊列 class MyQueue {Deque<Integer> inStack;Deque<Integer> outStack;public MyQueue() {inStack new ArrayDeque<Integer>();outStack new ArrayDeque<Integer>();}public void push(int x) {inStack.push(x);}public int pop…

13.跳躍游戲

文章目錄 題目簡介題目解答解法一&#xff1a;貪心算法&#xff0b;動態規劃代碼&#xff1a;復雜度分析&#xff1a; 題目鏈接 大家好&#xff0c;我是曉星航。今天為大家帶來的是 跳躍游戲面試題 相關的講解&#xff01;&#x1f600; 題目簡介 題目解答 思路&#xff1a;這…

Vue3知識總結-2

目錄 通過key來管理狀態 事件處理 內聯事件處理器 方法事件處理器 事件傳參 獲取event 傳遞參數 傳參的過程中獲取事件對象 事件修飾符 阻止事件描述符 阻止事件冒泡 數組變化偵測 變更方式 替換一個數組 計算屬性 Class綁定 綁定對象 綁定數組 Style綁定 …

【Python 常用腳本及命令系列 3.3 -- Python 統計程序執行時間】

請閱讀【嵌入式開發學習必備專欄】 文章目錄 Python 統計程序執行時間 Python 統計程序執行時間 在Python中&#xff0c;可以使用time模塊來測量執行一個函數所需的時間。以下是一個基本的例子&#xff0c;展示了如何實現這一功能&#xff1a; import time def your_function…