Vue3 + TypeScript全局阻止非輸入區域的Backspace鍵,防止回退頁面

main.ts

/*** 應用程序主入口** 初始化 Vue 應用并掛載到 DOM*/
import "./assets/style/main.scss";import { createApp } from "vue";
// 全局引入element-plus,對打包后的文件大小不是很在乎,那么使用全局導入會更方便
import ElementPlus from "element-plus";
// 全局引入element-plus的樣式
import "element-plus/dist/index.css";
// 引入element-plus國際語言的中文,element-plus國際語言默認為英文
// import locale from 'element-plus/dist/locale/zh-cn.js' // 引入這個組件,還需額外處理無法找到模塊的報錯
import locale from "element-plus/es/locale/lang/zh-cn"; // 引入這個組件更簡單
// 全局引入自定義樣式,全局更改element-plus的文本顏色(通過樣式覆蓋,覆蓋上面全局引入element-plus的樣式中的文本顏色)
import "@/assets/style/element-plus-text-color.scss";
import router from "@/router";
import { createPinia } from "pinia";
import piniaPluginPersistedstate from "pinia-plugin-persistedstate";
// 在env.d.ts文件中添加 declare module "vue3-print-nb";解決【無法找到模塊“vue3-print-nb”的聲明文件】的報錯
import print from "vue3-print-nb";
import App from "./App.vue";
// 引入全局樣式
import "@/assets/style/variables.scss";
import "@/assets/style/global.scss";
// 全局引入自定義的物資管理系統樣式
import "@/assets/style/global-warehouse.scss";const app = createApp(App);
const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);
app.use(ElementPlus, { locale });
app.use(router);
app.use(pinia);
app.use(print);// 全局阻止非輸入區域的Backspace鍵,防止回退頁面
document.addEventListener("keydown", (e) => {if (e.key === "Backspace") {const activeElement = document.activeElement as HTMLElement;const isEditable =activeElement.tagName === "INPUT" || activeElement.tagName === "TEXTAREA" || activeElement.isContentEditable;// 非輸入區域按下Backspace時阻止默認行為if (!isEditable) {e.preventDefault();// 可選:提示用戶(根據需求決定是否添加)console.warn("Backspace鍵在非輸入區域已被禁用,防止回退頁面。");}}
});app.mount("#app");// 項目安裝開發依賴 dependencies
// element-plus:                npm install element-plus --save
// vue-router:                  npm install vue-router@4
// axios:                       npm install axios
// pinia:                       npm install pinia
// pinia-plugin-persistedstate: npm i pinia-plugin-persistedstate
// mitt:                        npm i mitt
// vue3-print-nb:               npm install vue3-print-nb --save
// xlsx:                        npm install xlsx // xlsx是一個優秀的表格處理庫,是一款適用于瀏覽器和nodejs的開源電子表格解析庫
// 安裝xlsx的TypeScript類型聲明  npm install @types/xlsx -D
// dayjs                        npm install dayjs // dayjs是一個輕量級的JavaScript時間日期庫
// vite-plugin-vue-setup-extend npm i vite-plugin-vue-setup-extend -D //擴展Vue SFC的編譯邏輯,允許在<script setup>標簽上添加name屬性,設置組件名稱
// crypto-js                    npm install crypto-js // crypto-js是一個開源的JavaScript加密庫
// 安裝crypto-js官方類型聲明文件  npm i --save-dev @types/crypto-js
// accounting                   npm install accounting // accounting.js 是一個用于格式化數字、貨幣和金額的輕量級庫,特別適合財務和會計應用。
// 安裝accounting官方類型聲明文件 npm install --save-dev @types/accounting
// lodash-es                    npm install lodash-es // lodash-es 是一個一致性、模塊化、高性能的 JavaScript 實用工具庫// scss:                        npm i sass sass-loader --save-dev// 安裝Vue文檔生成工具 VueDocGen npm install -D vue-docgen-api vue-docgen-cli
// 安裝Vue文檔生成工具 TypeDoc   npm install -D typedoc
// 安裝typedoc-plugin-markdown  npm install -D typedoc-plugin-markdown
// 安裝typedoc-plugin-vue       npm install -D typedoc-plugin-vue
// 安裝typedoc-plugin-missing-exports npm install -D typedoc-plugin-missing-exports
// 安裝typedoc-vitepress-theme  npm install -D typedoc-vitepress-theme
// 安裝vitepress                npm install -D vitepress

在 Vue3 的?main.ts中實現全局事件監聽以阻止非輸入區域的 Backspace 鍵觸發頁面回退,可以通過以下步驟實現:


??方法:全局事件監聽??

在?main.ts中添加以下代碼,監聽?keydown事件并判斷 Backspace 鍵是否在非輸入區域觸發:

typescript

復制

import { createApp } from 'vue'; import App from './App.vue'; const app = createApp(App); // 全局阻止非輸入區域的Backspace鍵 document.addEventListener('keydown', (e) => { if (e.key === 'Backspace') { const activeElement = document.activeElement as HTMLElement; const isEditable = activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA' || activeElement.isContentEditable; // 非輸入區域按下Backspace時阻止默認行為 if (!isEditable) { e.preventDefault(); // 可選:提示用戶(根據需求決定是否添加) console.warn('Backspace鍵在非輸入區域已被禁用'); } } }); app.mount('#app');


??關鍵點解析??

  1. 1.

    ??事件監聽范圍??

    • ?

      通過?document.addEventListener全局監聽?keydown事件,覆蓋整個應用。

    • ?

      使用?e.key === 'Backspace'明確判斷 Backspace 鍵(兼容性更好,優于?keyCode

      1

      6

  2. 2.

    ??輸入區域檢測??

    • ?

      檢查當前焦點元素 (document.activeElement) 是否為可編輯元素(inputtextarea或?contentEditable屬性為?true的元素)

      1

      6

    • ?

      若不在可編輯區域,則調用?e.preventDefault()阻止默認回退行為。

  3. 3.

    ??注意事項??

    • ?

      ??性能優化??:無需手動移除監聽器,因為?main.ts是應用入口,監聽器會隨頁面生命周期持續生效。

    • ?

      ??用戶體驗??:可根據需求添加提示(如?alert或?console.log),但需謹慎避免頻繁干擾用戶

      6


??替代方案:自定義全局指令??

若需更靈活的局部控制,可在?main.ts中注冊一個全局指令:

typescript

復制

app.directive('prevent-backspace', { mounted(el) { el.addEventListener('keydown', (e) => { if (e.key === 'Backspace') { const target = e.target as HTMLElement; if (!['INPUT', 'TEXTAREA'].includes(target.tagName) && !target.isContentEditable) { e.preventDefault(); } } }); } });

??使用方式??:在組件模板中添加?v-prevent-backspace指令即可局部生效

1

6


??總結??

  • ?

    ??推薦方案??:直接在?main.ts中添加全局事件監聽,簡單高效。

  • ?

    ??擴展性??:如需動態控制,可結合路由守衛(router.beforeEach)或狀態管理(如?pinia)進一步定制邏輯

    3

    7

  • ?

    ??兼容性??:確保測試不同瀏覽器(尤其是舊版本)的鍵盤事件行為。

在 Vue3 中防止 Backspace 鍵觸發頁面回退,可以通過以下幾種方法實現,涵蓋全局監聽、路由守衛和自定義指令等方式:


1. ??全局事件監聽(阻止非輸入區域的 Backspace 鍵)??

在?main.js或組件的?mounted鉤子中監聽?keydown事件,判斷是否為 Backspace 鍵(key === 'Backspace'),并檢查當前焦點是否在可編輯元素(如輸入框)外。若不在輸入區域,則阻止默認行為:

javascript

下載

復制

運行

document.addEventListener('keydown', (e) => { if (e.key === 'Backspace') { const isEditable = document.activeElement.tagName === 'INPUT' || document.activeElement.tagName === 'TEXTAREA' || document.activeElement.isContentEditable; if (!isEditable) { e.preventDefault(); alert('當前頁面禁止后退'); // 可選提示 } } });

??優點??:簡單直接,適用于全局攔截。

??注意??:需在組件銷毀時移除監聽(onUnmounted鉤子)以避免內存泄漏

2

4


2. ??自定義 Vue 指令??

封裝一個指令?v-prevent-backspace,僅在特定組件內生效:

javascript

下載

復制

運行

// 注冊指令 app.directive('prevent-backspace', { mounted(el) { el.addEventListener('keydown', (e) => { if (e.key === 'Backspace') { const target = e.target; if (!['INPUT', 'TEXTAREA'].includes(target.tagName) && !target.isContentEditable) { e.preventDefault(); } } }); } }); // 使用指令 <template> <div v-prevent-backspace>僅在此div內禁止Backspace回退</div> </template>

??適用場景??:需要局部控制的組件

2


3. ??路由守衛結合 History API??

通過?router.beforeEach或?beforeRouteLeave守衛攔截導航,并配合?history.pushState修改瀏覽器歷史記錄:

javascript

下載

復制

運行

// 方法1:全局路由守衛 router.beforeEach((to, from, next) => { if (from.path === '/protected' && !confirm('確定離開?')) { next(false); // 取消導航 } else { next(); } }); // 方法2:組件內使用History API onMounted(() => { window.history.pushState(null, null, window.location.href); window.addEventListener('popstate', () => { window.history.pushState(null, null, window.location.href); }); });

??效果??:完全阻止后退操作,但需注意用戶體驗(如提示確認)

1

5

6


4. ??動態控制后退行為??

通過?ref管理狀態,靈活啟用/禁用后退攔截:

javascript

下載

復制

運行

import { ref, onBeforeUnmount } from 'vue'; const isBackDisabled = ref(false); const disableBack = () => { window.history.pushState(null, '', window.location.href); isBackDisabled.value = true; window.addEventListener('popstate', handlePopstate); }; const handlePopstate = () => { if (isBackDisabled.value) { window.history.pushState(null, '', window.location.href); } }; onBeforeUnmount(() => { window.removeEventListener('popstate', handlePopstate); });

??優勢??:可動態恢復后退功能(設置?isBackDisabled.value = false

4


總結建議

  • ?

    ??全局攔截??:優先使用 ??方法1?? 或 ??方法3?? 的路由守衛。

  • ?

    ??局部控制??:選擇 ??方法2?? 的自定義指令。

  • ?

    ??強限制場景??:結合 ??History API??(如方法3或方法4)徹底禁用后退,但需謹慎避免用戶體驗問題。

如需更詳細實現,可參考相關文檔或社區示例

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

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

相關文章

01數據結構-堆排序

01數據結構-堆排序前言1.堆2.堆的操作邏輯3.堆的代碼實現前言 數據結構中的堆是一種結構&#xff0c;C語言的堆是空間管理的程序員malloc&#xff0c;free的空間&#xff0c;兩者沒多大關系。 1.堆 邏輯上 堆&#xff08;Heap&#xff09;是一類基于完全二叉樹的特殊數據結構…

在線課程|基于SprinBoot+vue的在線課程管理系統(源碼+數據庫+文檔)

在線課程 目錄 基于SprinBootvue的在線課程管理系統 一、前言 二、系統設計 三、系統功能設計 1 管理員模塊的實現 2在線課程 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取&#xff1a; 博主介紹&#xff1a;??大廠碼農|…

Python海象運算符:=

文章目錄簡介??條件判斷優化循環控制簡化?推導式高效計算?正則匹配與數據提取?性能對比參考文獻簡介 海象運算符 :&#xff0c;又稱??賦值表達式??&#xff08;Assignment Expression&#xff09;&#xff0c;Python 3.8 后可用&#xff0c;PEP 572 引入&#xff0c;…

Vue 2 項目中快速集成 Jest 單元測試(超詳細教程)

在 Vue 項目中編寫單元測試&#xff0c;是提升代碼質量和維護性的關鍵一步。本文將帶你從零開始&#xff0c;在一個 Vue 2 Vue CLI 項目中集成 Jest 作為單元測試框架&#xff0c;并運行第一個測試用例。? 適用于 Vue 2 項目&#xff08;如你使用的是 vue-cli-service&#x…

PostgreSQL15——管理表空間

管理表空間一、基本概念二、創建表空間三、修改表空間四、刪除表空間一、基本概念 在 PostgreSQL 中&#xff0c;它是通過表空間&#xff08;Tablespaces&#xff09;來實現邏輯對象&#xff08;表、索引等&#xff09;與物理文件之間的映射。創建數據庫或者數據表&#xff08…

趣打印高級版--手機打印軟件!軟件支持多種不同的連接方式,打印神器有這一個就夠了!

軟件介紹&#xff08;文末獲取&#xff09;趣打印高級版是一款手機打印軟件。軟件支持五種不同的連接方式&#xff0c;每種都有穩定且快速的反應&#xff0c;用戶均可通過手機進行打印機的遠程使用和設置。軟件還支持上傳不同格式的文檔類型進行打印&#xff0c;方便快捷&#…

【開源框架】7 款流行的 Vue 3 后臺管理框架對比

以下是 7 個流行的 Vue 3 后臺管理框架在 Star 數&#xff08;截至 2025 年 8 月21日的 GitHub 最新數據&#xff09;、框架特點、基于的技術棧及開源協議四個方面的詳細對比&#xff1a; 1. Vue-Vben-Admin GitHub 地址&#xff1a;https://github.com/vbenjs/vue-vben-admin…

Datawhale工作流自動化平臺n8n入門教程(一):n8n簡介與平臺部署

前言 在數字化時代&#xff0c;重復性的工作任務正在消耗著我們大量的時間和精力。從數據同步到營銷自動化&#xff0c;從客戶服務到內容管理&#xff0c;這些瑣碎但必要的任務往往讓我們疲于應對。而工作流自動化工具的出現&#xff0c;為我們提供了一個優雅的解決方案。 今天…

SRE - 定位與能力

僅為個人知識總結與記錄 Site Reliability Engineer&#xff1a;站點可靠性工程&#xff08;SRE 軟件工程師 運維專家 可靠性專家&#xff09; 相對傳統的運維工程師&#xff0c;SER 注重開發&#xff0c;效率&#xff0c;追求自動化。對于 SRE 工程師&#xff0c;追究的就是…

StarRocks學習4-查詢優化與性能調優

? 1. 執行計劃分析&#xff08;EXPLAIN&#xff09; &#x1f31f; 作用&#xff1a; 用于查看 SQL 的執行路徑&#xff0c;判斷是否命中索引、物化視圖、Join 策略、并行度等。 &#x1f4cc; 常用命令&#xff1a; EXPLAIN SELECT ...; EXPLAIN VERBOSE SELECT ...;&#x1…

CentOS系統安裝Git全攻略

文章目錄? 方法一&#xff1a;使用 yum 或 dnf 包管理器安裝&#xff08;推薦&#xff09;1. 更新系統軟件包(非必須)[^1]2. 安裝 Git3. 驗證安裝? 方法二&#xff1a;從源碼編譯安裝&#xff08;適用于需要自定義版本或配置&#xff09;1. 安裝依賴包2. 下載 Git 源碼3. 編譯…

VR交通安全學習機-VR交通普法體驗館方案

VR交通安全學習機是一種基于虛擬現實技術的互動式教育設備&#xff0c;旨在通過虛擬環境模擬真實的交通場景&#xff0c;幫助用戶深入了解交通規則、交通信號、道路安全等知識&#xff0c;并通過沉浸式的體驗讓他們親身感受到不遵守交通規則的后果。無論是駕駛員、行人還是騎行…

算法題(188):團伙

審題&#xff1a; 本題需要我們通過解析所有人之間的關系&#xff0c;從而判斷出朋友團體的總個數并輸出 思路&#xff1a; 方法一&#xff1a;擴展域并查集 由于這里涉及對朋友/敵人等關系集合的頻繁操作&#xff0c;所以我們需要使用并查集來操作&#xff0c;但是普通的并查集…

C++開發/Qt開發:單例模式介紹與應用

單例模式是軟件設計模式中最簡單也是最常用的一種創建型設計模式。它的核心目標是確保一個類在整個應用程序生命周期中只有一個實例&#xff0c;并提供一個全局訪問點。筆者白話版理解&#xff1a;你創建了一個類&#xff0c;如果你希望這個類對象在工程中應用時只創建一次&…

Linux筆記---策略模式與日志

1. 設計模式設計模式是軟件開發中反復出現的問題的通用解決方案&#xff0c;它是一套套被反復使用、多數人知曉、經過分類編目的代碼設計經驗總結。設計模式并非具體的代碼實現&#xff0c;而是針對特定問題的抽象設計思路和方法論。它描述了在特定場景下&#xff0c;如何組織類…

關于多個el-input的自動聚焦,每輸入完一個el-input,自動聚焦到下一個

講解原理或者思路&#xff1a;如果你有多個el-input,想要實現每輸入完一個輸入框&#xff0c;然后自動聚焦到下一個輸入框&#xff0c;同理&#xff0c;如果每刪除一個輸入框的值&#xff0c;自動聚焦到上一個輸入框。條件那么首先要做的就是&#xff0c;設置條件&#xff0c;在…

AI 賦能教育變革:機遇、實踐與展望

引言說明教育在社會發展中的重要地位&#xff0c;以及傳統教育面臨的困境。引出 AI 技術為教育變革帶來新機遇&#xff0c;闡述研究其在教育中應用的價值。AI 為教育帶來的機遇個性化學習支持&#xff1a;講解 AI 通過分析學生學習數據&#xff0c;如答題情況、學習時間等&…

(一)八股(數據庫/MQ/緩存)

文章目錄 項目地址 一、數據庫 1.1 事務隔離級別 1. 事務的四大特性 2. Read Uncommited臟讀(未提交讀) 3. Read Commited幻讀(sql默認已提交讀) 4. Repeatable Read 5. Serializable 6. Snapshot(快照隔離) 7. 代碼開啟 8. For update和Repeatable Read的區別 1.2 各種鎖 …

STM32H750 CoreMark跑分測試

STM32H750 CoreMark跑分測試&#x1f50e;CoreMark跑分測試查詢網站&#xff1a;https://www.eembc.org/coremark/scores.php&#x1f4dc; CoreMark源碼&#xff1a;https://www.github.com/eembc/coremarkCoreMark移植和配置參考&#xff1a;https://community.st.com/t5/stm…

RabbitMQ如何確保消息發送和消息接收

消息發送確認 1 ConfirmCallback方法 ConfirmCallback 是一個回調接口&#xff0c;消息發送到 Broker 后觸發回調&#xff0c;確認消息是否到達 Broker 服務器&#xff0c;也就是只 確認是否正確到達 Exchange 中。 2 ReturnCallback方法 通過實現 ReturnCallback 接口&#xf…