本文详细解析JavaScript中键盘事件的捕获机制,对比onkeydown、onkeypress与onkeyup的执行顺序及keyCode差异,特别是大小写与数字键的区分。同时梳理HTML表单中Enter键触发submit的多种场景,包括按钮类型、输入框数量及浏览器兼容性差异,并提供accesskey快捷键设置与监听Enter键的完整代码示例。
表单Enter键提交行为与浏览器差异
在HTML表单中,Enter键通常触发submit操作,Esc键触发reset操作。但在IE6、Safari 4、Firefox 3.5、Opera 10及Chrome等浏览器中,按下Enter键不仅会触发form的submit事件,还会同时触发提交按钮的onclick事件,且触发顺序为:先执行提交按钮的onclick,再执行form的onsubmit。
<html dir="ltr" lang="zh-CN"> <head> <meta charset="gb2312"/> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <title>键盘事件</title> </head> <body> <h3>键盘事件</h3> </body> </html>[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
除了提交按钮,其他表单元素也可能触发form的submit事件,具体规则如下所述。
1. 若表单中包含一个type="submit"的按钮,则按下Enter键会生效并提交表单。
2. 若表单中仅包含一个type="text"的input元素,无论按钮的type属性为何,按下Enter键均会生效。
3. 若使用button元素而非input,且未指定type属性,在IE浏览器中默认视为type="button",而在Firefox中默认视为type="submit"。
4. 其他表单元素如textarea、select不影响触发规则,radio和checkbox也不影响触发规则。但在Firefox中,radio和checkbox本身会响应Enter键,而在IE中则不响应。
5. type="image"的input元素效果等同于type="submit"。尽管存在这种设计,但不推荐使用,建议通过CSS添加背景图来实现类似效果。
accesskey快捷键与语义化标签
除了按钮中绑定键盘事件外,浏览器还提供accesskey属性来指定链接的快捷键。需注意,若accesskey设置与浏览器菜单快捷键冲突,前者优先级更高。在IE中,快捷键为Alt+设置的键值;在Firefox中,为Alt+Shift+设置的键值。在IE中,a元素的accesskey仅将焦点转移至链接,并不等同于点击;而在Firefox中,则相当于直接点击。相比之下,input type=checkbox的accesskey在IE和Firefox中均表现为点击效果。此外,配合label标签使用可增强语义,个人强烈推荐此做法。
JavaScript键盘事件捕获机制
其余键盘事件需通过编程实现。JavaScript主要通过onkeydown、onkeypress和onkeyup三个事件来捕获键盘输入,其执行顺序为:onkeydown -> onkeypress -> onkeyup。一般情况下,使用这三种事件均可有效响应键盘输入,但在实际应用中,它们存在细微差别。
onkeypress事件无法正常响应系统功能键(如后退、删除等),且对中文输入法的支持有限;而onkeydown和onkeyup均能有效拦截系统功能键,只是截获位置不同,可根据具体需求选择合适的事件。
由于onkeypress无法捕获系统功能键,导致window.event对象的keyCode属性在onkeydown和onkeyup事件中获取的值与onkeypress不同。主要体现在:onkeypress的keyCode对字母大小写敏感,而onkeydown和onkeyup不敏感;onkeypress无法区分主键盘数字键与副键盘数字键,而onkeydown和onkeyup则能区分。
<!doctype html> <html dir="ltr" lang="zh-CN"> <head> <meta charset="gb2312"/> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <title>键盘事件</title> <style type="text/css"> td { text-align:center; } </style> </head> <body> <h3>键盘事件</h3> </body> </html> [Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
监听Enter键的JavaScript实现
我们可以利用以下脚本监听网页中的键盘事件,当用户按下Enter键时触发绑定的事件。
代码如下:
function getKey(e){
e = e || window.event;
var keycode = e.which ? e.which : e.keyCode;
if(keycode == 13 || keycode == 108){ //如果按下ENTER键
//在这里设置你想绑定的事件
}
}
// 把keyup事件绑定到document中
function listenKey ( ) {
if (document.addEventListener) {
document.addEventListener("keyup",getKey,false);
} else if (document.attachEvent) {
document.attachEvent("onkeyup",getKey);
} else {
document.onkeyup = getKey;
}
} 最后附上,键盘中所有按钮的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 | F7 | 118 |
| 1 | 97 | 9 | 105 | F2 | 113 | F8 | 119 |
| 2 | 98 | * | 106 | F3 | 114 | F9 | 120 |
| 3 | 99 | + | 107 | F4 | 115 | F10 | 121 |
| 4 | 100 | Enter | 108 | F5 | 116 | F11 | 122 |
| 5 | 101 | - | 109 | F6 | 117 | F12 | 123 |
| 6 | 102 | . | 110 | ||||
| 7 | 103 | / | 111 | ||||
| 控制键键码值(keyCode) | |||||||
|---|---|---|---|---|---|---|---|
| 按键 | 键码 | 按键 | 键码 | 按键 | 键码 | 按键 | 键码 |
| BackSpace | 8 | Esc | 27 | Right Arrow | 39 | -_ | 189 |
| Tab | 9 | Spacebar | 32 | Down 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 |
另外我们还可以用event.altKey,event.ctrlKey,event.metaKey(上有微软的旗帜),event.shiftKey来判断对应的键是否被按下,因为它们都是返回一个布尔值。