關于前端的防抖和節流

給我解釋下 前端開發中的防抖和節流 并舉個具體的例子

防抖(Debounce)與節流(Throttle)詳解

在前端開發中,防抖(Debounce)?和?節流(Throttle)?是兩種優化高頻觸發事件的技術,用于提升性能和用戶體驗。它們的核心區別在于:

  • 防抖:將多次觸發合并為一次執行(只執行最后一次)。
  • 節流:限制事件執行頻率(按固定間隔執行)。

防抖(Debounce)

原理
  • 在事件被觸發后,延遲?n?毫秒再執行回調。
  • 如果在這?n?毫秒內再次觸發事件,則重新計時。
適用場景
  • 搜索框實時聯想(用戶停止輸入后再請求)。
  • 窗口 resize 事件(只在調整結束后計算布局)。
  • 按鈕提交防止重復點擊。
代碼示例

javascript

// 防抖函數(非立即執行版)
function debounce(fn, delay) {let timer = null;return function(...args) {// 清除上一次定時器if (timer) clearTimeout(timer);// 重新設置定時器,延遲執行timer = setTimeout(() => {fn.apply(this, args);}, delay);};
}// 使用示例
const searchInput = document.getElementById('search-input');
searchInput.addEventListener('input', debounce((e) => {console.log('搜索:', e.target.value);// 發送搜索請求...
}, 300));

節流(Throttle)

原理
  • 限制一個函數在一定時間內只能執行一次。
  • 即使在這段時間內多次觸發事件,也只會按固定間隔執行。
適用場景
  • 滾動加載更多數據(每滾動一定距離觸發一次)。
  • 高頻點擊按鈕(如點贊、提交)。
  • 游戲中的技能冷卻。
代碼示例

javascript

// 節流函數(時間戳版)
function throttle(fn, limit) {let lastExecTime = 0;return function(...args) {const now = Date.now();// 如果距離上次執行超過限制時間,則執行if (now - lastExecTime > limit) {fn.apply(this, args);lastExecTime = now;}};
}// 使用示例
window.addEventListener('scroll', throttle(() => {console.log('滾動位置:', window.scrollY);// 檢查是否需要加載更多數據...
}, 200));

對比與選擇

特性防抖(Debounce)節流(Throttle)
執行時機只在最后一次事件觸發后執行按固定間隔執行
高頻觸發只執行一次按頻率執行多次
應用場景搜索聯想、窗口 resize、防止重復提交滾動加載、高頻點擊、游戲技能冷卻
實現方式定時器時間戳或定時器

高級實現(帶配置選項)

防抖(支持立即執行)

javascript

function debounce(func, wait, immediate = false) {let timeout;return function() {const context = this;const args = arguments;const later = () => {timeout = null;if (!immediate) func.apply(context, args);};const callNow = immediate && !timeout;clearTimeout(timeout);timeout = setTimeout(later, wait);if (callNow) func.apply(context, args);};
}
節流(結合時間戳和定時器)

javascript

function throttle(func, limit) {let timeout;let lastExecTime = 0;return function() {const context = this;const args = arguments;const now = Date.now();const remaining = limit - (now - lastExecTime);if (remaining <= 0) {// 如果超過限制時間,立即執行if (timeout) {clearTimeout(timeout);timeout = null;}func.apply(context, args);lastExecTime = now;} else if (!timeout) {// 否則,等待剩余時間后執行timeout = setTimeout(() => {func.apply(context, args);lastExecTime = Date.now();timeout = null;}, remaining);}};
}

實際應用示例

1. 搜索框防抖

javascript

const searchInput = document.getElementById('search-input');searchInput.addEventListener('input', debounce((e) => {// 300ms 內沒有新輸入時才發送請求fetch(`/api/search?q=${e.target.value}`).then(res => res.json()).then(data => renderResults(data));
}, 300));
2. 滾動加載節流

javascript

window.addEventListener('scroll', throttle(() => {// 每 200ms 檢查一次是否需要加載更多if (isScrollAtBottom()) {loadMoreData();}
}, 200));
3. 按鈕點擊防抖

javascript

const submitBtn = document.getElementById('submit-btn');submitBtn.addEventListener('click', debounce(() => {// 防止重復提交,2秒內只執行一次submitForm();
}, 2000, true)); // 立即執行版,點擊后先執行,2秒內不再執行

總結

  • 防抖:適合需要合并多次觸發的場景,避免不必要的計算或請求。
  • 節流:適合需要限制執行頻率的場景,如滾動、拖拽等高頻事件。

合理使用這兩種技術可以顯著提升應用性能,減少資源浪費,改善用戶體驗

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

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

相關文章

React-router 多類型歷史記錄棧

react-router 為了滿足開發者更多路由歷史存儲場景&#xff0c;提供了以下幾種模式&#xff1a; 瀏覽器原生歷史記錄 瀏覽器 hash 內存型 服務端記錄 以上實現分別對應于一下 API 實現&#xff1a; createBrowserRouter&#xff1a;瀏覽器提供的歷史管理。 createHashRou…

java設計模式[3]之結構型模式

文章目錄 一 代理模式1.1 靜態代理1.1.1 靜態代理的結構1.1.2 靜態代理的特點1.1.3 靜態代理的應用場景1.1.4 靜態代理的案例代碼 1.2 JDK動態代理1.2.1 JDK動態代理概述1.2.2 JDK動態代理案例代碼1.2.3 JDK動態代理的應用場景1.2.4 JDK動態代理的特點1.2.5 與創建型模式的區別…

鴻蒙Harmony測試-wukong穩定性工具(類似Android的Monkey測試)

一、功能介紹 wukong是系統自帶的一種命令行工具&#xff0c;支持Ability的隨機事件注入、控件注入、異常捕獲、報告生成和對Ability數據遍歷截圖等特性。通過模擬用戶行為&#xff0c;對系統或應用進行穩定性壓力測試。wukong分為隨機測試、專項測試和專注測試。 隨機測試是指…

從零學起VIM

前言 筆者早年剛入行的時候就接觸過Vim,當時還是真正的菜鳥&#xff0c;帶我的師父是一個華為骨干員工&#xff0c;猶記得他給我指導如何保存并關閉文本&#xff1a;按Esc&#xff0c;然后輸入:wq。還記得自己打開Vim編輯器&#xff0c;一個字符都敲不進去&#xff0c;然后問旁…

不依賴rerank 模型排序通過使用 PostgreSQL 中的 pgvector 與 tsearch2 函數進行混合搜索提高召回率

前言 在向量搜索中&#xff0c;召回率是一個關鍵指標&#xff0c;它衡量搜索結果的相關性。然而&#xff0c;提高召回率往往會犧牲其他指標&#xff0c;如索引大小或查詢延遲。為了平衡這些權衡&#xff0c;混合搜索技術應運而生。本文將介紹如何在 PostgreSQL 中結合 pgvecto…

Uniapp 跨平臺開發框架全面解析:一次開發,多端運行

在移動互聯網時代&#xff0c;開發者面臨著一個重要挑戰&#xff1a;如何高效地開發出能在多個平臺&#xff08;iOS、Android、Web、小程序等&#xff09;上運行的應用&#xff1f;傳統的原生開發方式需要為每個平臺單獨編寫代碼&#xff0c;導致開發周期長、維護成本高。而 Un…

ios如何把H5網頁變成主屏幕webapp應用

一、將 H5 頁面添加到主屏幕的步驟 打開 Safari 瀏覽器 在 iPhone 上打開 Safari 瀏覽器&#xff0c;訪問目標網頁&#xff08;H5 頁面&#xff09;。 點擊分享按鈕 在 Safari 瀏覽器底部點擊 “分享” 圖標&#xff08;箭頭向上的按鈕&#xff09;。 添加到主屏幕 在分享菜單…

Node.js 項目啟動命令大全 (形象版)

文章目錄 Node.js 項目啟動命令大全 &#x1f31f;?&#xff08;形象版&#xff09;一、&#x1f50d; 如何查看項目啟動命令&#xff08;魔法書目錄&#xff09;package.json scripts 參數詳解開發相關腳本測試相關腳本構建相關腳本代碼質量相關腳本最佳實踐 二、&#x1f68…

愛普特APT32F1104C8T6單片機 高抗干擾+硬件加密雙保障

愛普特APT32F1104C8T6單片機深度解析 1. 產品定位 APT32F1104C8T6 是愛普特半導體&#xff08;APT&#xff09;推出的 32位高性能經濟型單片機&#xff0c;基于 ARM Cortex-M0內核&#xff0c;采用 LQFP48封裝&#xff0c;主打 高性價比、低功耗、強抗干擾&#xff0c;是替代進…

使用uni-app ios 打包流程

配置幾個步驟即可 1、打包ios需要BundleID ID 2、證書私鑰密碼 3、信任文件證書文件 4、私鑰證書 5、打包 6、獲取打包后的ipa文件 7、通過愛思助手安裝到iso手機上 8、完成 1、下載&#xff1a;App Uploader去獲取我們想要的證書私鑰等文件 2、下載完成解壓后的文件如下打…

仿muduo庫實現并發服務器

1.實現目標 仿muduo庫One Thread One Loop式主從Reactor模型實現高并發服務器&#xff1a; 通過實現高并發服務器的組件&#xff0c;可以快速實現一個高并發服務器的搭建&#xff0c;并且&#xff0c;通過組內不同應用層協議的支持&#xff0c;可以快速完成高性能服務器的搭建…

迭代器模式:集合遍歷的統一之道

引言&#xff1a;集合遍歷的演進之路 在軟件開發中&#xff0c;集合遍歷是我們每天都要面對的基礎操作。從最初的數組索引遍歷到現代的流式處理&#xff0c;我們經歷了&#xff1a; #mermaid-svg-KwTr9k8JgbwRTDhU {font-family:"trebuchet ms",verdana,arial,sans-…

Spring Security OAuth2 組件

我們來系統地講解一下 Spring Security OAuth2 這個強大的組件。我會從概念、作用、核心組件&#xff0c;以及實際應用場景來為你剖析。 1. 什么是 Spring Security OAuth2&#xff1f; 簡單來說&#xff0c;Spring Security OAuth2 是 Spring Security 框架的一個模塊&#…

Redis的持久化功能

Redis的持久化功能能夠將內存中的數據保存到磁盤&#xff0c;從而在重啟后恢復數據。下面為你詳細介紹Redis的兩種主要持久化方式及其配置方法。 RDB&#xff08;Redis Database&#xff09;持久化 RDB持久化是通過生成某個時間點的數據集快照來實現的。它具有高性能的特點&a…

Chrome 將成為下一個 IE6

最近在技術圈刷到一個帖子&#xff0c;說&#xff1a;“Chrome 就快變成新的 IE6 了。” 乍一看有點危言聳聽&#xff0c;但你一細品&#xff0c;發現還真挺像回事。 想當年&#xff1a;IE6 是怎么垮的&#xff1f; IE6 當年多風光&#xff1f;全球市場份額一度超過 90%&#…

Redis 配置文件詳解redis.conf 從入門到實戰

一、redis.conf 是什么&#xff1f; Redis 的配置文件&#xff08;默認命名為 redis.conf&#xff0c;Redis 8.0 之后改為 redis-full.conf&#xff09;控制著服務運行的各項參數。該文件采用以下結構&#xff1a; 指令名 參數1 參數2 ... 參數N例如&#xff1a; replicaof …

autoware docker的安裝

前言 官方的安裝說明&#xff1a; 官方的安裝說明 安裝前&#xff0c;請確認安裝的硬件&#xff1a; CPU with 8 cores16GB RAM[Optional] NVIDIA GPU (4GB RAM) 滿足需求 1. 安裝軟件依賴 這一步主要是安裝三個軟件&#xff1a; DockerNVIDIA Container Toolkit (pref…

AWS 解決方案深度剖析:Amazon QLDB — 構建可信賴、不可變的數據審計基石

導言&#xff1a;數據可信的挑戰 在現代應用開發中&#xff0c;尤其是在金融、供應鏈、身份認證、政府事務、醫療記錄管理等領域&#xff0c;數據完整性和歷史追溯性至關重要。我們常常面臨以下挑戰&#xff1a; 審計困難&#xff1a; 如何證明數據從誕生至今未被篡改&#xf…

Leetcode-?1358. 包含所有三種字符的子字符串數目?

Problem: 1358. 包含所有三種字符的子字符串數目 思路 滑動窗口 解題過程 滑動窗口&#xff1a;使用左右指針 l 和 r 維護一個窗口&#xff0c;窗口內字符的頻次由 cnt 記錄。 右指針擴展&#xff1a;右指針 r 不斷右移&#xff0c;將字符加入窗口并更新頻率。 左指針收縮&a…

iTunes 無法備份 iPhone:10 種解決方法

Apple 設備是移動設備市場上最先進的產品之一&#xff0c;但有些人遇到過 iTunes 因出現錯誤而無法備份 iPhone 的情況。iTunes 拒絕備份 iPhone 時&#xff0c;可能會令人非常沮喪。不過&#xff0c;幸運的是&#xff0c;我們有 10 種有效的方法可以解決這個問題。您可以按照以…