本文详解JavaScript中键盘事件的触发机制,包括keydown、keypress和keyup的执行顺序及区别。重点分析keyCode与charCode属性在不同浏览器中的表现,以及ctrlKey等修饰键的用法,并提供控制元素移动和捕获事件顺序的实战代码示例。
键盘事件在JavaScript开发中应用广泛,其触发机制与鼠标事件类似。当用户按下字符键时,事件按顺序触发:先触发keydown,接着是keypress,最后是keyup。其中,keydown和keypress在文本框内容更新前触发,而keyup在内容更新后触发。若用户长按字符键,keydown和keypress会重复触发。对于非字符键,仅触发keydown和keyup,长按时仅keydown重复触发。
一、键盘事件属性
键盘事件定义了多个属性以精确控制操作。这些属性通常仅在键盘事件发生时存在于事件对象中,但ctrlKey和shiftKey例外,它们也可在鼠标事件中获取,例如在按下Ctrl或Shift键的同时点击鼠标。
| 属性 | 说明 |
|---|---|
| keyCode | 该属性包含键盘中对应键位的键值 |
| charCode | 该属性包含键盘中对应键位的 Unicode 编码,仅 DOM 支持 |
| target | 发生事件的节点(包含元素),仅 DOM 支持 |
| srcElement | 发生事件的元素,仅 IE 支持 |
| shiftKey | 是否按下 Shift 键,如果按下返回 true,否则为false |
| ctrlKey | 是否按下 Ctrl 键,如果按下返回 true,否则为false |
| altKey | 是否按下 Alt 键,如果按下返回 true,否则为false |
| metaKey | 是否按下 Mtea 键,如果按下返回 true,否则为false,仅 DOM 支持 |
示例1
ctrlKey和shiftKey属性可用于键盘和鼠标事件,用于检测Ctrl或Shift键是否被按住。以下示例演示了如何监测这两个键是否同时按下:若同时按下且鼠标点击页面元素,则将该元素从页面中移除。
document.onclick = function (e) {
var e = e || window.event; //标准化事件对象
var t = e.target || e.srcElement; //获取发生事件的元素,兼容IE和DOM
if (e.ctrlKey && e.shiftKey) { //如果同时按下Ctrl和Shift键
t.parentNode.removeChild(t); //移出当前元素
}
}keyCode和charCode属性的使用较为复杂,但在实际开发中十分常见。因此,有必要对比这两个属性在不同事件类型及浏览器中的表现,以便开发者根据需求选择合适的响应类型和属性值。
keyCode 和 charCode 属性值
| 属性 | IE 事件模型 | DOM 事件模型 |
|---|---|---|
| keyCode(keypress) | 返回所有字符键的正确值,区分大写状态(65~90)和小写状态(97~122) | 功能键返回正确值,而 Shift、Ctrl、Alt、PrintScreen、ScrollLock 无返回值,其他所有键值都返回 0 |
| keyCode(keydown) | 返回所有键值(除 PrintScreen 键),字母键都以大写状态显示键值(65~90) | 返回所有键值(除 PrintScreen 键),字母键都以大写状态显示键值(65~90) |
| keyCode(keyup) | 返回所有键值(除 PrintScreen 键),字母键都以大写状态显示键值(65~90) | 返回所有键值(除 PrintScreen 键),字母键都以大写状态显示键值(65~90) |
| charCode(keypress) | 不支持该属性 | 返回字符键,区分大写状态(65~90)和小写状态(97~122),Shift、Ctrl、Alt、PrintScreen、ScrollLock 无返回值,其他所有键值都返回 0 |
| charCode(keydown) | 不支持该属性 | 所有键值为 0 |
| charCode(keyup) | 不支持该属性 | 所有键值为 0 |
部分功能键(如PageUp和Home)的键值兼容性存在一定问题,但常用功能键和字符键的表现通常较为稳定。
示例2
以下示例演示如何利用方向键控制页面元素的移动效果。
<div id="box"></div>
<script>
var box = document.getElementById("box"); // 获取页面元素的引用指针
box.style.position = "absolute"; // 色块绝对定位
box.style.width = "20px"; // 色块宽度
box.style.height = "20px"; // 色块高度
box.style.backgroundColor = "red"; // 色块背景
document.onkeydown = keyDown;
//在Document对象中注册keyDown事件处理函数
function keyDown(event){ // 方向键控制元素移动函数
var event = event || window.event; // 标准化事件对象
switch(event.keyCode){ // 获取当前按下键盘键的编码
case 37 : // 按下左箭头键,向左移动5个像素
box.style.left = box.offsetLeft - 5 + "px";
break;
case 39 : // 按下右箭头键,向右移动5个像素
box.style.left = box.offsetLeft + 5 + "px";
break;
case 38 : // 按下上箭头键,向上移动5个像素
box.style.top = box.offsetTop - 5 + "px";
break;
case 40 : // 按下下箭头键,向下移动5个像素
box.style.top = box.offsetTop + 5 + "px";
break;
}
return false
}
</script>
在该示例中,首先获取页面元素,通过CSS设置其绝对定位、大小和背景色。随后在document对象上注册keydown事件处理函数keyDown(),用于侦测当前按下的方向键并调整元素在窗口中的位置。元素的offsetLeft和offsetTop属性用于存取其在页面中的坐标位置。
键盘响应顺序
JavaScript中的键盘事件主要包含以下三种类型:
- keydown:按下键盘某键时触发。若按住该键,事件会不断触发(Opera浏览器不支持此连续触发行为)。若事件处理函数返回false,将取消默认动作(如阻止字符输入),在IE和Safari中还会禁止keypress事件的响应。
- keypress:按下并释放键盘键时触发。若按住该键,事件会不断触发。若事件处理函数返回false,将取消默认动作(如阻止字符输入)。
- keyup:释放键盘键时触发。该事件仅在按键松开时触发一次,不处于持续响应状态。
通过keydown、keypress和keyup事件可以获取用户按下的键码信息。其中keydown和keypress表现基本一致,但部分浏览器不允许使用keypress获取按键信息。所有元素均支持键盘事件,但其主要应用场景仍集中在表单输入中。
按下键盘时,会连续触发多个事件,具体顺序如下。
对于字符键,事件响应顺序为:keydown → keypress → keyup。对于非字符键(如功能键或特殊键),响应顺序为:keydown → keyup。
若长按字符键,keydown和keypress事件将持续逐个发生,直至松开按键。若长按非字符键,仅keydown事件会持续发生,直至松开按键。
示例
以下设计了一个简单示例,用于获取键盘事件的响应顺序。
<textarea id="text" cols="26" rows="16"></textarea>
<script>
var n = 1; // 定义编号变量
var text = document.getElementById("text"); // 获取文本区域的引用指针
text.onkeydown = f; // 注册keydown事件处理函数
text.onkeyup = f; // 注册keyup事件处理函数
text.onkeypress = f; // 注册keypress事件处理函数
function f(e){ // 事件调用函数
var e = e || window.event; // 标准化事件对象
text.value += (n++) + "=" + e.type +" (keyCode=" + e.keyCode + ")\n";
//捕获事件响应信息
}
</script>
键盘键码keyCode对照表
| 字母和数字键的键码值(keyCode) | |||||||
|---|---|---|---|---|---|---|---|
| 按键 | 键码 | 按键 | 键码 | 按键 | 键码 | 按键 | 键码 |
| A | 65 | J | 74 | S | 83 | 1 | 49 |
| B | 66 | K | 75 | T | 84 | 2 | 50 |
| C | 67 | L | 76 | U | 85 | 3 | 51 |
| D | 68 | M | 77 | V | 86 | 4 | 52 |
| E | 69 | N | 78 | W | 87 | 5 | 53 |
| F | 70 | O | 79 | X | 88 | 6 | 54 |
| G | 71 | P | 80 | Y | 89 | 7 | 55 |
| H | 72 | Q | 81 | Z | 90 | 8 | 56 |
| I | 73 | R | 82 | 0 | 48 | 9 | 57 |
| 数字键盘上的各键键码值(keyCode) | 功能键键码值(keyCode) | ||||||
|---|---|---|---|---|---|---|---|
| 按键 | 键码 | 按键 | 键码 | 按键 | 键码 | 按键 | 键码 |
| 0 | 96 | 8 | 104 | F1 | 112 | F9 | 120 |
| 1 | 97 | 9 | 105 | F2 | 113 | F10 | 121 |
| 2 | 98 | * | 106 | F3 | 114 | F11 | 122 |
| 3 | 99 | + | 107 | F4 | 115 | F12 | 123 |
| 4 | 100 | Enter | 108 | F5 | 116 | ||
| 5 | 101 | - | 109 | F6 | 117 | ||
| 6 | 102 | . | 110 | F7 | 118 | ||
| 7 | 103 | / | 111 | F8 | 119 | ||
| 控制键键码值(keyCode) | |||||||
|---|---|---|---|---|---|---|---|
| 按键 | 键码 | 按键 | 键码 | 按键 | 键码 | 按键 | 键码 |
| BackSpace | 8 | Esc | 27 | Right Arrow | 39 | -_ | 189 |
| Tab | 9 | Spacebar | 32 | Dw Arrow | 40 | .> | 190 |
| Clear | 12 | Page Up | 33 | Insert | 45 | /? | 191 |
| Enter | 13 | Page Down | 34 | Delete | 46 | `~ | 192 |
| Shift | 16 | End | 35 | Num Lock | 144 | [{ | 219 |
| Control | 17 | Home | 36 | ;: | 186 | \| | 220 |
| Alt | 18 | Left Arrow | 37 | =+ | 187 | ]} | 221 |
| Cape Lock | 20 | Up Arrow | 38 | ,< | 188 | '" | 222 |
| 多媒体键码值(keyCode) | |||
|---|---|---|---|
| 按键 | 键码 | 按键 | 键码 |
| 音量加 | 175 | 浏览器 | 172 |
| 音量减 | 174 | 邮件 | 180 |
| 停止 | 179 | 搜索 | 170 |
| 静音 | 173 | 收藏 | 171 |
到此这篇关于js常用的键盘事件有哪些_用法示例_键码keyCode对照表的文章就介绍到这了,更多相关js键盘事件keyCode内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!