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…