Vue中的键盘事件

目 录

1. 概述

2. JavaScript 键盘事件

  • 2.1 键盘事件类型
    • 2.1.1 keydown 事件
    • 2.1.2 keypress 事件
    • 2.1.3 keyup 事件
    • 2.1.4 input 事件
  • 2.2 键盘事件的响应顺序

3. Vue 键盘事件监听与处理

  • 3.1 获取按键的 键码(keyCode)
  • 3.2 监听按键事件

4. Vue 按键修饰符

  • 4.1 按键别名
  • 4.2 系统按键修饰符
  • 4.3 自定义按键修饰符
    • 4.3.1 Vue2 中自定义按键修饰符
    • 4.3.2 Vue3已弃用自定义按键修饰符

1. 概述

在监听键盘事件时,我们经常需要检查特定的按键。

2. JavaScript 键盘事件

2.1 键盘事件类型

2.1.1 keydown 事件

keydown事件在键盘按键按下的时候触发。
例如:

<input placeholder="Press down a key." size="40">
<script>
const eventTarget = document.querySelector('input');
eventTarget.addEventListener("keydown", e => {console.log(`${e.code}`)
});
</script>

你也可以通过DOM元素的 onkeydown 属性来定义 keydown 事件的回调函数:

const eventTarget = document.querySelector('input');
eventTarget.keydown = (e)=>{console.log(`${e.code}`)
}
2.1.2 keypress 事件

当某个键被按下并且该键通常产生一个字符值(使用input代替)时,将触发keypress事件。

2.1.3 keyup 事件

keyup 事件在按键被松开时触发。

例如:

<input placeholder="Press and release a key." size="40">
<script>
const eventTarget = document.querySelector('input');
eventTarget.addEventListener("keyup", e => {console.log(`${e.code}`)
});
</script>

你也可以通过DOM元素的 onkeyup 属性来定义 keyup 事件的回调函数:

const eventTarget = document.querySelector('input');
eventTarget.keyup = (e)=>{console.log(`${e.code}`)
}

[Note]
keydownkeyup 事件提供指出哪个键被按下的代码,而 keypress 指出哪些字符被输入。
例如,小写字母“a”在 keydownkeyup 时会被报告为 65,但在 keypress 时为 97。所有事件均将大写字母“A”报告为 65。

2.1.4 input 事件

当一个 <input>, <select>, 或 <textarea> 元素,以及 contenteditable = true 元素、document.designMode='on' 文档的 value 被修改时,会触发 input 事件。

  • 对于 type=checkbox 或 type=radio 的 input 元素,每当用户切换控件(通过触摸、鼠标或键盘)时,input 事件都应该触发。然而,历史事实并非如此。请检查兼容性,或使用 change 事件代替这些类型的元素。

  • 在contenteditable 和 designMode 的情况下,事件的 target 为当前正在编辑的宿主。如果这些属性应用于多个元素上,当前正在编辑的宿主为最近的父节点不可编辑的祖先元素。

例如:

<input placeholder="Enter some text" name="name"/>

<script>
const eventTarget = document.querySelector(‘input’);

eventTarget.addEventListener(‘input’, (e)=>{
console.log(e.srcElement.value);
});
</script>

当然你也可以使用 DOM 的 oninput 属性来指定回调:

const eventTarget = document.querySelector('input');
eventTarget.oninput = (e)=>{console.log(e.srcElement.value);
}

2.2 键盘事件的响应顺序

当按下键盘时,将连续触发多个事件。

  1. 对于一次普通字符从按下到释放的过程中,其按键事件响应顺序为:
    keydown => keypress => input => keyup

  2. 对于非字符键,如 CtrlBackspace等,键盘事件的相应顺序为:keydown => keyup。(而 keypressinput 不会触发)。

  3. 对于 Enter,键盘事件的相应顺序为:keydown => keypress =>keyup

  4. 若按下某个普通字符键不放,则 keydown 和 keypress 事件将逐个持续发生,直至松开按键:在这里插入图片描述

  5. 如果按下非字符键(非Enter)不放,则只有 keydown 事件持续发生,直至松开按键:在这里插入图片描述上图中,按下 Ctrl 时,不断触发 keydown 事件,松开时,触发 keyup 事件。

  6. 如果持续按下 Enter 键放开,则 keydownkeypress 事件将逐个持续发生,直至松开按键时,触发 keyup 事件:在这里插入图片描述

3. Vue 键盘事件监听与处理

3.1 获取按键的 键码(keyCode)

可以通过数据双向绑定(v-model)绑定一个 keydown 事件来获取按键的键码:

<template><input v-model="msg" @keydown="keydown" placeholder="Enter key" name="name"/>
</template>

<script lang=ts>
import { defineComponent } from ‘vue’;
export default defineComponent({
setup(props){
const msg=‘’;
return {
msg:msg
}
},
methods:{
keydown(event:any){
console.log(event.keyCode);
}
}
})
</script>

在这里插入图片描述

常用键码:

a65Ctrl17Backspace8
b66Caps20delete46
Shift16End35
z99Alt18Insert45
Fn93|220/111
Num144*106-(小键盘)109
`192Enter13(57
Window91Pause19)48
@50#51$52
%53^54&55
-189=187;186
'222.(小键盘)110.190
0480 (小键盘)96F1112
1491 (小键盘)97F2113
9579 (小键盘)105F12123

3.2 监听按键事件

vue 提供了一种便利的方式来监听按键事件,只需要在被监听的DOM元素上使用 v-on 指令指定按键事件、按键 以及 事件的回调函数,例如:

<input v-on:keyup.13="submit" />

该指令可以使用 @ 语法糖写成以下简写形式:

<input @keyup.13="submit" />

其中 keyup 表示按键事件为keyup13 表示按键的键值为 13 ,也就是 Enter 键。Vue 为该键提供了别名.enter,因此.13也可写成.enter。关于按键别名,在 4.1 按键别名 将会进一步介绍。

submit 是回调函数名,这个函数需要在methods(当使用选项式API时)中定义。

对于回调函数,我们是可以传入参数的。但是如果我们不在调用时传入参数,则默认传入一个参数enent。你也可以手动传入第一个参数,使用 $event,比如:

<input v-model="msg" @keydown="submit($event)" placeholder="Enter key" name="name"/>

如果需要在回调函数中使用,则在声明时需要用一个标识符去接受这个参数。比如:

submit(event){// 阻止默认事件 event.preventDefault();
}

当然,这个案例中,要想阻止默认事件可以像其它 vue 事件一样,使用 .prevent 修饰,vue将自动调用event.preventDefault();,即:

<input v-model="msg" @keydown.prevent="submit($event)"/>

4. Vue 按键修饰符

4.1 按键别名

Vue 为一些常用的按键提供了别名:
.enter.tab.delete.esc.space.up.down.left.rightpage-uppage-down等等。
其中: .delete 捕获“Delete”和“Backspace”两个按键。

例如:

<input @keyup.enter="submit" />

这相当于:

 <input v-on:keyup.13="submit">

4.2 系统按键修饰符

Vue 允许在 v-on 或 @ 监听按键事件时添加 按键修饰符 。我们可以使用以下 系统按键修饰符 来触发鼠标或键盘事件监听器,只有当相应按键被按下时才会触发。

系统按键修饰符和常规按键不同。与 keyup 事件一起使用时,该按键必须在事件发出时处于按下状态。换句话说,keyup.ctrl 只会在你仍然按住 ctrl 但松开了另一个键时被触发。若你单独松开 ctrl 键将不会触发。

.ctrl
.alt
.shift
.meta

例如:

<input @keyup.alt.enter="clear" />

4.3 自定义按键修饰符

使用按键的别名给了我们很多方便,但 vue 中也并没有对所有按键都定义别名。不过好在 vue 为我们提供了一种通过全局 config.keyCodes 来定义按键修饰符别名的方法。

4.3.1 Vue2 中自定义按键修饰符

在 Vue2 中,定义的格式为:

Vue.config.keyCodes.别名 = 键码;

需要注意的是,我们必须在创建 Vue 对象实例(vm)前定义。例如我们可以在 main.js 中:

Vue.config.keyCodes.f2 = 113;
let vm = new Vue{{// 配置项...
}}
4.3.2 Vue3已弃用自定义按键修饰符

这一小节是为从 Vue2 迁移到 Vue3 而写的,在目前官方文档中暂时没有找到详细的介绍。 Vue3 中没有提供用于创建 vm 的 Vue 对象转而提供 createApp

import { createApp } from 'vue';
const app = createApp({// 配置项
})

事实上,Vue3中不再受支持 config.keyCodes。由于新的 JavaScript 标准中 KeyboardEvent.keyCode (点击链接参考MDN) 已被弃用,Vue 3 继续支持此功能也不再有意义。 废弃的 KeyboardEvent.keyCode 代表着一个唯一标识的所按下的键的未修改值,它依据于一个系统和实现相关的数字代码。它被 KeyboardEvent.code 属性替代,这个属性表示键盘上的物理键(与按键生成的字符相对),但是目前在一些浏览器中并未实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/799344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java理论小作业(2)--类

第一题 1.题目&#xff1a; 2.解析&#xff1a; 首先&#xff0c;我们来分析Hello1类的结构和给定代码的执行流程&#xff1a; Hello1类中有两个成员变量&#xff0c;一个静态的a和一个非静态的b。静态变量a属于类本身&#xff0c;而非静态变量b属于类的每一个实例&#xff…

开启Java之旅——用Java实现简易的图书管理系统(24.4.7)

图书管理系统 一、设计思路 1、首先需要区分两类人&#xff0c;图书管理员和借书用户&#xff0c;不同的用户要展现不同的界面&#xff0c;利用继承和多态可以将其实现。 2、要将不同的操作封装起来&#xff0c;单独设计成为一个类&#xff0c;为了规范实现&#xff0c;需要…

gcc/g++:预编译阶段取消宏定义

预编译阶段取消宏定义&#xff0c;可分为两种情况&#xff1a;1&#xff09;内部取消&#xff0c;2&#xff09;外部取消。 示例&#xff1a; 1&#xff09;用户程序 /*brief test demo-for-precompile-to-undef? show you hereauthor wenxuanpeiemail 15873152445163.com(q…

synchronized-锁优化

自旋锁 自旋锁是一种基于忙等待的同步机制&#xff0c;用于保护临界区代码的并发访问。与互斥锁相比&#xff0c;自旋锁尝试通过忙等待来避免线程的切换和阻塞&#xff0c;从而减少开销。 自旋锁的定义&#xff1a;自旋锁是一种基于忙等待的同步机制&#xff0c;在线程无法获…

蓝桥杯 第 9 场 小白入门赛 字符迁移

题目&#xff1a; 3.字符迁移【算法赛】 - 蓝桥云课 (lanqiao.cn) 思路&#xff1a; 此题通过把小写字母映射成数字&#xff0c;进行差分即可。 AC代码&#xff1a; #include<iostream> #include<cstring> #include<algorithm>using namespace std;typed…

LeetCode-33. 搜索旋转排序数组【数组 二分查找】

LeetCode-33. 搜索旋转排序数组【数组 二分查找】 题目描述&#xff1a;解题思路一&#xff1a;二分查找。1.找哨兵节点&#xff08;nums[0]或nums[-1]&#xff09;可以确定nums[mid]位于前一段或后一段有序数组中。2. 就是边界left和right的变换&#xff0c;具体看代码。解题思…

基于SpringBoot的“民宿管理平台系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“民宿管理平台系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 用户首页界面图 民宿信息管理界面图 房间预订…

IFC文件分析工具Top 5

分析行业基础类 (IFC) 文件是确保建筑信息模型 (BIM) 数据准确性和一致性的关键步骤。 在验证这些文件期间需要考虑各个方面&#xff0c;以避免错误并确保项目的最佳运行。 在本文中&#xff0c;我们将介绍验证 IFC 文件的五种有效方法&#xff0c;帮助你对 IFC 文件的质量充…

python开发poc2,爆破脚本

#本课知识点和目的&#xff1a; ---协议模块使用&#xff0c;Request 爬虫技术&#xff0c;简易多线程技术&#xff0c;编码技术&#xff0c;Bypass 后门技术 下载ftp服务器模拟器 https://lcba.lanzouy.com/iAMePxl378h 随便创建一个账户&#xff0c;然后登录进去把ip改成…

AI大模型下的策略模式与模板方法模式对比解析

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL应用》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#xff1a;设计模式深度解析&#xff1a;AI大模型下…

3D目标检测跟踪 | 基于kitti+waymo数据集的自动驾驶场景的3D目标检测+跟踪渲染可视化

项目应用场景 面向自动驾驶场景的 3D 目标检测目标跟踪&#xff0c;基于kittiwaymo数据集的自动驾驶场景的3D目标检测跟踪渲染可视化查看。 项目效果 项目细节 > 具体参见项目 README.md (1) Kitti detection 数据集结构 # For Kitti Detection Dataset └── k…

4.7总结(内部类,JDBC API || 离散化,树状数组)

JAVA学习小结 一.内部类 基础概念&#xff0c;用途和访问特点 什么是内部类&#xff1a;写在一个类中的另一个类称之为内部类&#xff1b; 内部类的用途&#xff1a;用于封装那些单独存在时没有意义&#xff0c;且是外部类的一部分的类&#xff08;汽车发动机&#xff0c;人…

记录CodeMirror一些常用的配置选项

mode&#xff1a;设置编辑器的语言模式&#xff0c;例如JavaScript、HTML、CSS、Markdown等。theme&#xff1a;设置编辑器的主题&#xff0c;例如ambiance、eclipse、monokai等。lineNumbers&#xff1a;设置是否显示行号。readOnly&#xff1a;设置是否只读。gutters&#xf…

【MySQL探索之旅】数据库设计以及聚合查询

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

golang - 简单实现linux上的which命令

本文提供了在环境变量$PATH设置的目录里查找符合条件的文件的方法。 实现函数 import ("fmt""os""path""strings" )// 实现 unix whtich 命令功能 func Which(cmd string) (filepath string, err error) {// 获得当前PATH环境变量en…

Django之静态文件及模板语法(上)

Python学习之路系列文章目录 python面向对象之警察与匪徒火拼场景模拟python面向对像之第二次笔记Django环境搭建及测试第1个Django应用及Django的请求处理Django之静态文件及模板语法&#xff08;上&#xff09; 静态文件及模板语法 Python学习之路系列文章目录一、静态文件1.…

java面试题(5)|Java 中 throw 与 throws 的区别是什么?

在Java中&#xff0c;throw和throws是两个关键字&#xff0c;它们用于异常处理&#xff0c;但在语法和作用上有所不同&#xff1a; throw&#xff1a; throw 关键字用于在代码块中抛出一个异常对象。当某个条件发生时&#xff0c;你可以使用 throw 关键字手动抛出一个异常&am…

【面经】2024春招-软件开发工程师-后端方向1

面经整理系列&#xff1a; 【面经】软件开发工程师-后端方向1 文章目录 岗位与面经基础1&#xff1a;数据库 & 网络基础2&#xff1a;系统 & 语法模板3&#xff1a;算法 & 项目 岗位与面经 岗位介绍 JD: 美团-软件开发工程师-后端方向-1小时左右 金融服务平台 技…

SQLite 4.9的虚拟表机制(十四)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite 4.9的 OS 接口或“VFS”&#xff08;十三&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 1. 引言 虚拟表是向打开的 SQLite 数据库连接注册的对象。从SQL语句的角度来看&#xff0c; 虚拟表对象与任何其他…

【uniapp小程序-跳转另一个小程序】

https://blog.csdn.net/m0_61702149/article/details/126145953 不传参的情况写法&#xff0c;上面的链接包含传参的写法 在当前小程序在pages.json写上 要跳转的小程序的id "navigateToMiniProgramAppIdList":["要跳转的小程序的appid"] 小程序A到B&#…