js防止重復提交的3種解決方案

防止 javascript 重復點擊和提交的關鍵方法有三種:1. 禁用按鈕法,點擊后立即禁用按鈕并更改文本提示,請求完成后恢復;2. 節流函數(throttle),限制函數在設定時間間隔內僅執行一次,適用于非即時響應場景;3. 使用標志位,通過變量標記操作狀態以阻止重復觸發。此外,前端可通過按鈕文本變化或加載動畫提升用戶提示體驗,而后端則可通過 token 機制、悲觀鎖/樂觀鎖及冪等性設計確保數據一致性與安全性。選擇方案應根據具體場景決定,前端與后端結合使用可提供更全面的防護。

防止 JavaScript 重復點擊和提交,關鍵在于控制用戶行為,避免短時間內多次觸發相同操作。這不僅僅是用戶體驗的問題,更關系到數據一致性和服務器壓力。

解決方案

  1. 禁用按鈕法: 這是最直接也最常用的方法。點擊按鈕后,立即禁用它,防止用戶再次點擊。待請求完成后,再重新啟用按鈕。

const button = document.getElementById('myButton');button.addEventListener('click', function() {button.disabled = true;button.textContent = '處理中...'; // 可選:更改按鈕文本提示用戶// 模擬一個異步請求setTimeout(() => {// 請求成功或失敗后的處理button.disabled = false;button.textContent = '提交'; // 恢復按鈕文本}, 2000);
});

?

?這種方法的優點是簡單易懂,缺點是用戶體驗可能略差,因為按鈕禁用期間無法進行任何操作。可以結合按鈕文本的變化來改善用戶體驗。

2,節流函數(Throttle): 使用節流函數可以限制函數在一定時間內只能執行一次。這適用于那些不需要立即響應的場景,比如搜索框的輸入事件。?

function throttle(func, delay) {let timeoutId;let lastExecTime = 0;return function(...args) {const now = Date.now();const timeSinceLastExec = now - lastExecTime;if (!timeoutId) {if (timeSinceLastExec >= delay) {func.apply(this, args);lastExecTime = now;} else {timeoutId = setTimeout(() => {func.apply(this, args);lastExecTime = Date.now();timeoutId = null;}, delay - timeSinceLastExec);}}};
}const myFunc = () => {console.log("函數執行");
};const throttledFunc = throttle(myFunc, 1000); // 1秒內只允許執行一次// 多次調用 throttledFunc,但實際上只有在間隔超過 1 秒時才會執行
throttledFunc();
throttledFunc();
setTimeout(throttledFunc, 500);
setTimeout(throttledFunc, 1200);

?

節流函數的核心在于時間控制,確保函數在規定的時間間隔內只執行一次。

3,使用標志位: 定義一個變量來標記是否正在進行操作。如果正在進行操作,則忽略后續的點擊事件

let isSubmitting = false;const form = document.getElementById('myForm');form.addEventListener('submit', function(event) {event.preventDefault(); // 阻止默認的表單提交if (isSubmitting) {console.log('正在提交,請稍候...');return;}isSubmitting = true;console.log('開始提交...');// 模擬一個異步提交setTimeout(() => {console.log('提交完成!');isSubmitting = false;}, 3000);
});

?

這種方法簡單直接,但需要注意在異步操作完成后,一定要將標志位重置,否則后續操作將無法進行。

如何選擇最合適的防止重復提交方案?

這取決于你的具體應用場景。如果只需要簡單地防止按鈕被連續點擊,禁用按鈕法是最簡單的選擇。如果需要限制函數在一定時間內只能執行一次,節流函數更合適。如果需要更精細的控制,比如在表單提交過程中防止重復提交,使用標志位可能更靈活。

禁用按鈕后,如何優雅地提示用戶正在處理中?

僅僅禁用按鈕可能讓用戶感到困惑,不知道發生了什么。更好的做法是結合按鈕文本的變化,例如將按鈕文本改為“處理中...”或顯示一個加載動畫。此外,還可以使用模態框或消息提示來告知用戶當前的狀態。

const button = document.getElementById('myButton');
const originalText = button.textContent;button.addEventListener('click', function() {button.disabled = true;button.textContent = '處理中...'; // 更改按鈕文本button.classList.add('loading'); // 添加一個 loading class,用于顯示加載動畫// 模擬一個異步請求setTimeout(() => {// 請求成功或失敗后的處理button.disabled = false;button.textContent = originalText; // 恢復按鈕文本button.classList.remove('loading'); // 移除 loading class}, 2000);
});

?在 CSS 中定義 .loading 類,例如:

.loading {position: relative;padding-right: 25px; /* 為加載動畫預留空間 */
}.loading::after {content: '';position: absolute;top: 50%;right: 5px;width: 15px;height: 15px;border-radius: 50%;border: 2px solid #ccc;border-top-color: #333;animation: spin 1s linear infinite;transform: translateY(-50%);
}@keyframes spin {to {transform: translateY(-50%) rotate(360deg);}
}

?

除了前端,后端如何防止重復提交?

前端的防止重復提交只能解決一部分問題,更可靠的方案是在后端進行驗證。常見的后端防止重復提交的方法包括:

  • Token 機制: 在前端頁面生成一個唯一的 Token,每次提交請求時都帶上這個 Token。后端驗證 Token 的有效性,如果 Token 已經被使用過,則拒絕本次請求。
  • 悲觀鎖/樂觀鎖: 在數據庫層面使用鎖機制,確保同一時間只有一個請求可以修改數據。
  • 冪等性設計: 將接口設計成冪等的,即使多次調用,結果也應該是一致的。例如,可以使用唯一 ID 來標識請求,后端根據 ID 來判斷是否已經處理過該請求。

后端防止重復提交是更可靠的方案,可以有效地防止惡意攻擊和網絡延遲等問題導致的重復提交。

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

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

相關文章

【信創-k8s】銀河麒麟V10國防版+鯤鵬/飛騰(arm64架構)在線/離線部署k8s1.30+kubesphere

銀河麒麟作為國家核高基專項的重要成果,國防版憑借其卓越的安全性和可靠性,已成為軍工領域的首選操作系統。之前我們在適配麒麟V4國防版的過程中已發現諸多安全性要求,而麒麟V10國防版在安全防護等級上又達到了更高的級別。 本文將主要演示離…

解鎖單周期MIPS硬布線:Logisim實戰全攻略

目錄 一、引言二、MIPS 架構與單周期設計原理2.1 MIPS 架構概述2.2 單周期設計原理剖析 三、Logisim 工具基礎3.1 Logisim 簡介3.2 基本操作與組件認識 四、單周期 MIPS 硬布線設計步驟4.1 了解 MIPS 指令集4.2 搭建數據通路4.3 設計硬布線控制器4.4 在 Logisim 中創建電路 五、…

7.4.2B+樹

B樹: (1)每個分支節點最多有m個子樹(孩子節點)。 階:即看當前的B樹是幾階B樹,就看每個分支節點最多有幾個子樹,還是看最下一層有幾個分叉就是幾階??? 葉子節點:最下邊的一層叫葉子…

MFC獲取本機所有IP、局域網所有IP、本機和局域網可連接IP

獲取本機所有IP地址 // 獲取本機所有IP地址 int CMachine::GetLocalIPs(std::vector<CString>& vIPValue) {//返回IP數量&#xff0c; -1表示獲取失敗vIPValue.clear();int IpNum 0;//1.初始化wsa WSADATA wsaData;int ret WSAStartup(MAKEWORD(2, 2), &wsaD…

【C語言】貪吃蛇小游戲

1. 所需知識 C語言函數、枚舉、結構體、動態內存管理、預處理指令、鏈表、Win32 API... 2. Win32 API介紹 2.1 Win32 API windows這個多作業系統除了協調應用程序的執行、分配內存、管理資源之外&#xff0c;它同時也是一個很大的服務中心&#xff0c;調用這個服務中心的各種…

PostgreSQL 容器化分布式技術方案

&#x1f4cb; 目錄 引言&#xff1a;為什么選擇容器化PostgreSQLPostgreSQL容器化基礎分布式架構設計高可用實現方案讀寫分離架構動態擴縮容策略生產環境實踐總結與展望 引言&#xff1a;為什么選擇容器化PostgreSQL 在數字化轉型的浪潮中&#xff0c;數據庫作為企業的"…

NV025NV033美光固態閃存NV038NV040

美光固態閃存技術突破與市場布局深度解析 一、技術突破&#xff1a;232層NAND閃存與高密度存儲的革新 美光NV系列固態閃存的核心競爭力源于其232層NAND閃存技術&#xff0c;這一技術通過垂直堆疊工藝&#xff0c;將存儲單元層層疊加&#xff0c;宛如在指甲蓋面積內構建超過20…

Matplotlib 繪圖庫從入門到精通:Python 數據可視化全解析

引言 在數據科學的世界里&#xff0c;"一圖勝千言" 這句話有著深刻的含義。數據可視化不僅是數據分析師展示成果的重要手段&#xff0c;更是數據科學家探索數據、發現規律的強大工具。Matplotlib 作為 Python 生態系統中最著名的數據可視化庫&#xff0c;為我們提供…

北斗導航 | 基于CNN-LSTM-PSO算法的接收機自主完好性監測算法

接收機自主完好性監測 原理概述1. 算法架構2. 核心創新點3. 工作流程數學模型1. CNN特征提取2. LSTM時序建模3. PSO優化決策MATLAB完整代碼算法優勢性能對比應用場景擴展方向原理概述 1. 算法架構 #mermaid-svg-fITV6QrXL1fNYFwG {font-family:"trebuchet ms",verda…

【微信小程序】9、用戶拒絕授權地理位置后再次請求授權

1、獲取用戶當前的地理位置 在本專欄的上一篇文章中講了如何 獲取用戶當前的地理位置 首次請求 wx.getLocation API 后&#xff0c;會拉起用戶授權界面 但這時用戶可能會拒絕授權&#xff0c;當你再次請求 wx.getLocation API 后&#xff0c;沒有任何效果。 2、打開設置 用…

嵌入式Linux驅動開發基礎-1 hello驅動

1:APP打開的文件在內核中如何表示 1.1 APP 打開文件時&#xff0c;可以得到一個整數&#xff0c;這個整數被稱為文件句柄。對于 APP 的每一個文件句柄&#xff0c;在內核里面都有一個“struct file ”與之對應 當我們使用 open 打開文件時&#xff0c;傳入的 flags 、 mode…

目標跟蹤存在問題以及解決方案

3D 跟蹤 一、數據特性引發的跟蹤挑戰 1. 點云稀疏性與遠距離特征缺失 問題表現&#xff1a; 激光雷達點云密度隨距離平方衰減&#xff08;如 100 米外車輛點云數不足近距離的 1/10&#xff09;&#xff0c;導致遠距離目標幾何特征&#xff08;如車輪、車頂輪廓&#xff09;不…

JavaSE-JDK安裝

目錄 一.在官網下載安裝包 二.安裝JDK 三.檢測JDK是否安裝成功 四.配置系統環境變量 一.在官網下載安裝包 Oracle官網https://www.oracle.com/cn/java/technologies/downloads/ 二.安裝JDK 1.首先在C盤以為的其他盤中創建一個自己可以找到的存放JDK路徑&#xff1a; 2.雙擊下…

使用docker搭建redis主從架構,一主2從

使用Docker搭建Redis主從架構&#xff08;一主兩從&#xff09; Redis主從架構是提高系統可用性和讀取性能的重要方案&#xff0c;通過Docker可以快速搭建該架構。下面將詳細介紹搭建步驟。 架構設計 我們將搭建包含以下組件的架構&#xff1a; 1個主節點&#xff08;Maste…

機器學習3——參數估計之極大似然估計

參數估計 問題背景&#xff1a; P ( ω i ∣ x ) p ( x ∣ ω i ) P ( ω i ) p ( x ) p ( x ) ∑ j 1 c p ( x ∣ ω j ) P ( ω j ) \begin{aligned} & P\left(\omega_i \mid \mathbf{x}\right)\frac{p\left(\mathbf{x} \mid \omega_i\right) P\left(\omega_i\right)…

Spring AOP Pointcut 表達式的語法是怎樣的?(execution(...) 是最常用的,還有哪些

Pointcut 表達式是 AOP 的核心&#xff0c;我將詳細解析最常用的 execution 表達式&#xff0c;并介紹其他幾種同樣非常有用的表達式。 1. execution 指示符 (最常用&#xff0c;最強大) execution 用于匹配方法的執行&#xff08;Join Point&#xff09;。它的語法結構最為完…

基于 SpringBoot+Vue 的臺球廳管理系統的設計與實現(畢業論文)

基于 SpringBootVue 的臺球廳管理系統的設計與實現&#xff08;模板&#xff09;[三號宋體加粗&#xff0c;居中] 摘 要[首行縮進2字符&#xff0c;五號黑體加粗]&#xff1a;摘要內容[五號楷體]本文所提出的基于J2EE/EJB標準的電子化采購平臺及其CRM組件綜合解決方案&#xf…

運營醫療信息化建設的思路

醫療機構加強運營管理&#xff0c;必須依賴強有力的醫院信息系統。信息化很重要&#xff0c;但不能為了信息化而信息化。運營信息化必須有明確的建設目標。 運營信息化建設的目標&#xff0c;包括幾個方面&#xff1a; 1.實時反映業務&#xff1b; 2.體現內控思維&#xff1b…

6.24_JAVA_微服務day07_RabbitMQ高級

1、 RabbitListener(queuesToDeclare/*此處是固定寫法&#xff0c;只能寫這個玩意兒&#xff0c;因為這里是庫里的方法*/ Queue(name "lazy.queue",//如果不存在就創建lazy.queue隊列durable "true",//把耐用打開arguments Argument(name "x-que…

Python打卡:Day38

知識點回顧&#xff1a; Dataset類的__getitem__和__len__方法&#xff08;本質是python的特殊方法&#xff09;Dataloader類minist手寫數據集的了解 浙大疏錦行