JavaScript 练手小技巧:键盘事件

news2024/11/13 16:16:17

键盘事件应该是鼠标事件之外,使用频率最高的 JS 事件了吧?

一般用于全局或者表单

键盘事件由用户击打键盘触发,主要有keydownkeypresskeyup三个事件。

  • keydown:按下键盘时触发。Ctrl、Shift、Alt 等和其它按键组合时,组合键的事件监听通常要使用 keydown

  • keypress:按下有值的键时触发(即只支持字符键、空白键、enter,如字母,数字,+、=等),即按下 Ctrl、Alt、Shift、Meta 这样无值的键,这个事件不会触发。对于有值的键,按下时先触发keydown事件,再触发这个事件。

  • keyup:松开键盘时触发该事件。

如果用户一直按键不松开,就会连续触发键盘事件,触发的顺序如下。

  1. keydown

  2. keypress

  3. keydown

  4. keypress

  5. ...(重复以上过程)

  6. keyup

document.addEventListener("keydown",function (event) {
    console.info("keydown");
});
document.addEventListener("keypress",function (event) {
    console.info("keypress");
});
document.addEventListener("keyup",function (event) {
    console.info("keyup");
});

因此,在按下某个键要进行操作的时候,我们更推荐用 keyup,它只会触发一次,防止键盘事件多次触发。

1. 获取按键

如何知道按下什么键?

 (1)KeyboardEvent.code

KeyboardEvent.code 属性表示键盘上的物理键(与按键生成的字符相对)。

document.addEventListener("keydown",function (event) {
    console.info("keydown", event.code);
});

可以利用 if 语句判断用户按下了某个键。

document.addEventListener("keydown",function (event) {
    if( event.code == "KeyA"){
        console.info("You press key A");
    }
});

下面是一些常用键的字符串形式,其它键请查看 MDN 文档

  • 字母键A - z:返回KeyA - KeyZ不区分大小写

  • 方向键:返回ArrowDownArrowUpArrowLeftArrowRight

  • Alt 键:返回 AltLeftAltRight

  • Shift 键:返回ShiftLeftShiftRight

  • Ctrl 键:返回ControlLeftControlRight

  • 数字键0 - 9:返回digit0 - digit9

  • 小键盘数字键0-9: Numpad1 - Numpad9

  • 功能键F1 - F12:返回 F1 - F12

(2)KeyboardEvent.key

虽然 KeyboardEvent.code 可以判断用户按下某个键,但是如果用户使用的不是物理键盘,而是虚拟键盘或辅助功能设备,可能会出现兼容性问题,并且判断失误。

此时,要确定哪个字符与键事件对应,请改用 KeyboardEvent.key 属性。

KeyboardEvent.key 表示按下的是哪个字符(区分大小写

  • 如果按下的键代表可打印字符,则返回这个字符。可以区分大小写

  • 如果按下的键代表不可打印的特殊字符,则返回预定义的键值,比如 Backspace,Tab,Enter,Shift,Control,Alt,CapsLock,Esc,Spacebar,PageUp,PageDown,End,Home,Left,Right,Up,Down,PrintScreen,Insert,Del,Win,F1~F12,NumLock,Scroll 等。不区分左右 shift 等

  • 如果同时按下一个控制键和一个符号键,则返回符号键的键名。比如,按下 Ctrl + a,则返回a;按下 Shift + a,则返回大写的A

  • 如果无法识别键名,返回字符串Unidentified

document.addEventListener("keydown",function (event) {
    console.info( event.key );
});

(3)注意事项

  • 字母按键判断推荐 KeyboardEvent.code ,其它字符按键推荐使用 KeyboardEvent.key

code 获取字母键盘,不需要判断大小写;key 获取 enter 键,不用在意是主 enter,还是小键盘的enter。

可以从以下代码的实操,感受 key 和 code 的差异。

document.addEventListener("keydown",function (event) {
    console.info( event.key ,"---", event.code );
});

也可以通过网址:JavaScript Key Code Event Tool | Toptal®,检测 code 和 key 的差异。

  • 特殊的功能键 ctrl、shift、alt、win 键的判断

虽然通过 key 或者 code 可以判断出这些功能键是否按下,但是考虑到它们经常做组合键使用,因此这几个特殊的按键,可以直接通过 event.属性 获取到,它们是只读的 bool 值,表示是否按下了某个按键。

KeyboardEvent.altKey: 是否按下 AltOption 键。

KeyboardEvent.ctrlKey:是否按下 Ctrl 键。

KeyboardEvent.metaKey:是否按下 ⌘ Command 键。

KeyboardEvent.shiftKey:是否按下 Shift 键。

组合键用 keydown 事件,它们和其它按键组合时,组合键的事件监听通常要使用 keydown 事件,keypresskeyup 监听不到。

如,判断是否按下了 ctrl + c,并禁止用户复制网页内容。

window.addEventListener("keydown", function (event) {
    if(event.ctrlKey && event.code=="KeyC"){
        console.info("你按了 ctrl + c,本页内容禁止复制。");
    }
});
  • PrintScreen 需要使用 keyup 事件监听

屏幕上的截屏键,即 PrintScreen,它是一个系统的截屏快捷键,用于截取整个屏幕到“剪贴板”(clipboard),按下截屏后,直接粘贴到某个位置即可。

PrintScreen 按键的监听需要使用keyup 事件,其他事件 keypresskeydown 都无法监听到。

window.addEventListener("keyup", function (event) {
    if( event.key === "PrintScreen"){
        console.info("按下了截屏键");
    }else{
        console.info("其它键");
    }
});
  • 浏览器中某些按键的默认操作无法被阻止

如,ctrl + p 组合的打印页面操作;截屏 PrintScreen 操作。

  • KeyboardEvent.keyCode 官方已经不推荐使用,但是浏览器仍然支持。虽然可用,但是已经不推荐。这里不提。

2. 按键区域

KeyboardEvent.location属性返回一个整数,表示按下的键处在键盘的哪一个区域。它可能取以下值。

  • 0:处在键盘的主区域,或者无法判断处于哪一个区域。

  • 1:处在键盘的左侧,只适用那些有两个位置的键(比如 Ctrl 和 Shift 键)。

  • 2:处在键盘的右侧,只适用那些有两个位置的键(比如 Ctrl 和 Shift 键)。

  • 3:处在数字小键盘。

3. 是否激活指定的功能键

KeyboardEvent.getModifierState()方法返回一个布尔值,表示是否按下或激活指定的功能键。

可以通过此方法来判断键盘上对应功能键是否被激活,如是否按下了大小写锁定键,是否打开了数字键盘等。

它的常用参数如下。

  • Alt:Alt 键

  • CapsLock:大写锁定键

  • Control:Ctrl 键

  • Meta:Meta 键

  • NumLock:数字键盘开关键

  • Shift:Shift 键

window.addEventListener("keydown", function (event) {
    if (
        event.getModifierState('Control') +
        event.getModifierState('Alt') +
        event.getModifierState('Meta') > 1
    ) {
       console.info("yes");
    }
});

上面代码表示,只要ControlAltMeta里面,同时按下任意两个或两个以上的键就输出“yes”。

4. 跟表单结合

例:在标签里重复文本框里的内容。

<input type="text" id="myInput">
<div id="box"></div>
<script>
    let input = document.getElementById("myInput");
    let box = document.getElementById("box");
    input.addEventListener("keyup", function (event) {
        box.innerHTML = this.value ;
    });
</script>

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

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

相关文章

BCNF与3NF

今天学了一下午这个BCNFBCNFBCNF与3NF3NF3NF&#xff0c;有感而发&#xff0c;特来总结。好像好久不打键盘了&#xff0c;这手好像刚长出来的一样。本文浅显的分析一下两种范式的关系与不同以及判断方法和分解算法&#xff0c;以做总结。 BCNFBCNFBCNF范式的定义如下: 设属性集…

linux 常用指令大全

目录一、基本指令指令基本格式1、ls1.1 ls相关选项2、pwd3、cd4、mkdir4.1、mkdir相关选项5、touch6、cp6.1 cp相关选项7、mv8、rm8.1、rm相关选项9、输出重定向10、cat11、df11.1、df 相关选项12、free12.1、free 相关选项13、head13.1、head相关选项14、tail14.1 tail相关选项…

day13 二叉树 | 144、二叉树的前序遍历 145、二叉树的后序遍历 54、二叉树的中序遍历

二叉树基础 二叉搜索树 二叉搜索树是一个有序树。 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b;若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结点的值&#xff1b;它的左、右子树也分别为二叉排序树 下面这两棵…

零食商城|基于springboot的零食商城

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

GuLi商城-简介-项目介绍、分布式基础概念、微服务架构图

一、项目简介 1 、项目背景 1 &#xff09;、电商模式 市面上有 5 种常见的电商模式 B2B、B2C、C2B、C2C、O2O&#xff1b; 1 、 B2B 模式 B2B (Business to Business)&#xff0c; 是指商家与商家建立的商业关系。 如&#xff1a;阿里巴巴 2 、 B2C 模式 B2C (Business…

Win7安装高版本的NodeJS方法,亲测可用

Win7安装高版本的NodeJS方法 正常情况下&#xff0c;Win7所能支持的Node.js最高版本为:V13.14&#xff0c;在开发过程中&#xff0c;git下来的项目由于node版本比较高的原因&#xff0c;好多package都不能还原或出现诸多警告 网络大神分享的安装高版本的方法&#xff1a; 1、…

Express 通过 CORS 或 JSONP 解决跨域问题

文章目录参考描述同源策略同源同源策略示例CSRF 攻击解决跨域问题CORSCORS 响应头部Access-Control-Allow-Origin简单请求预检请求预检请求包含的两次请求解决CORS 中间件使用 CORS 中间件处理跨域请求JSONP通过原生 JS 向服务器端发起 JSONP 请求通过 jQuery 向客户端发起 JSO…

mysql:如何在windows环境下配置并随意切换两种mysql版本

系列文章目录 文章目录系列文章目录前言一、去官网下载zip安装包二、配置创建my.ini文件2.环境变量3、使用管理员身份打开dos命令窗口4、安装mysql8的服务和初始化data5、启动6 错误解决&#xff1a;修改mysql8服务的注册表最后前言 之前安装过5.7的版本 后来由于需要 就安装了…

天龙八部TLBB从0到1搭建教程-上

服务器的配置选择与购买 我们需要准备的东西,是环境安装和4核8G的服务器一台。 其实购买服务器的地方很多以下这些服务商都可以,具体看服务器的配置选择,像这种4核8G的 服务器价格在260-400之间一台仅供参考,当然还有带防的服务器价格就偏高了阿里云、腾讯、百度、西部数码…

年后公司新来一00后卷王,我们这帮老油条真干不过.....

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 2023年春…

MySQL深分页 + 多字段排序场景的优化方案【三百万级数据量】

需求背景 目前产品需要针对一个大范围地区内的所有用户做排行榜功能&#xff0c;且这个排行榜有几个比较蛋疼的附加需求&#xff1a; 排行榜需要全量展示所有用户&#xff0c;且做分页展示&#xff08;大坑&#x1f4a5;&#xff09; 排行榜有4种排序条件&#xff0c;且每个排…

fatal error怎么解决,有什么快捷的解决方法

fatal error怎么解决&#xff0c;其实是有多种的解决方法的&#xff0c;主要是看你想用哪种解决方法去进行解决&#xff0c;下面一起来看看。 一.fatal error的解决方法 1、按winR&#xff0c;弹出运行窗口。 2、输入regedit点击确定&#xff0c;弹出注册表编辑器。 3、在注…

2023年数据库优化顶级原理

毫不夸张的说咱们后端工程师&#xff0c;无论在哪家公司&#xff0c;呆在哪个团队&#xff0c;做哪个系统&#xff0c;遇到的第一个让人头疼的问题绝对是数据库性能问题。如果我们有一套成熟的方法论&#xff0c;能让大家快速、准确的去选择出合适的优化方案&#xff0c;我相信…

Acwing-1116. 马走日

本题求有多少路径遍历棋盘上的所有点&#xff0c;属于外部搜索&#xff0c;所以需要回溯。另外&#xff0c;对于递归终止条件&#xff0c;我们添加一个参数用来表示当前遍历到第几个点&#xff0c;如果是n*m表明已经将棋盘遍历一遍了&#xff0c;方案数1&#xff0c;return即可…

Linux常用命令——screen命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) screen 用于命令行终端切换 补充说明 Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话&#xff0c;并在其间自由切换。GNU Screen可以看作是…

Linux学习笔记本(不定期持续更新)

一、概述 2023年&#xff0c;打算系统自学一遍Linux&#xff0c;分享到这里来&#xff0c;和大家一起相互学习&#xff0c;探讨。 二、Linux基础知识 Linux学习环境搭建学习每一门技术&#xff0c;系统环境很重要&#xff0c;好的系统环境能够极大提高学习效率。学习Linux也是一…

33. 实战:实现某网站店铺信息的查询与批量抓取(附源码)

目录 前言 目的 思路 代码实现 1. 请求URL&#xff0c;获取源代码 2. 解析源代码&#xff0c;获取数据 3. 完善保存数据的函数save_data 4. 理清main函数逻辑&#xff0c;循环传递每一页有效信息的参数 完整代码 运行效果 总结 前言 近日&#xff0c;我们每周四都能…

ESP-C3入门5. 使用通用计时器

ESP-C3入门5. 使用通用计时器一、 简介二、使用步骤三、操作函数1. 基本操作&#xff08;1&#xff09;定时器实例 gptimer_handle_t &#xff08;2&#xff09; 定时器配置结构体 gptimer_config_t&#xff08;3&#xff09; 定时器初始化 timer_init()&#xff08;3&#xff…

探索 Vue.js 中引用的力量:访问和操作 DOM 元素”

0.简介 Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。它由 Evan You 于 2014 年创建&#xff0c;此后作为构建 Web 应用程序的工具越来越受欢迎。 Vue 的核心特性包括&#xff1a; 反应式数据绑定&#xff1a;Vue 使用反应式系统来跟踪对数据模型的更改并自动更新…

22年部署之docker学习

以下记录的是&#xff0c;我在学习中的一些学习笔记&#xff0c;这篇笔记是自己学习的学习大杂烩&#xff0c;主要用于记录&#xff0c;方便查找https://hub.docker.com/ 镜像中心Docker 常用命令&#xff1a; docker 运行相关运行&#xff1a; service docker start停止&#…