jQuery 键盘事件教程
键盘事件是网页交互中非常重要的一部分,比如表单输入、快捷键、游戏控制等,jQuery 提供了简洁易用的方法来处理这些事件。

(图片来源网络,侵删)
我们将主要学习以下三个核心事件:
keydown: 当用户按下键盘上的任意键时触发(包括功能键如 Shift, Ctrl, Alt)。keyup: 当用户释放一个键时触发。keypress: 当用户按下一个会产生字符值的键时触发(a, 1, Enter, $)。注意:keypress在 jQuery 3.0 版本后已被废弃,不推荐在新代码中使用。
基础事件绑定
让我们从最简单的例子开始,监听整个文档的键盘事件。
keydown 示例
这个例子会在你按下键盘的任何键时,在控制台打印出按下的键。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">jQuery Keyboard Event Demo</title>
<style>
body { font-family: sans-serif; padding: 20px; }
#log {
border: 1px solid #ccc;
padding: 10px;
height: 200px;
overflow-y: scroll;
background-color: #f9f9f9;
}
.log-entry { padding: 5px; border-bottom: 1px solid #eee; }
</style>
</head>
<body>
<h1>jQuery 键盘事件演示</h1>
<p>请在下方输入框或页面任何地方按下键盘按键。</p>
<input type="text" id="myInput" placeholder="试试在这里输入...">
<h2>事件日志:</h2>
<div id="log"></div>
<!-- 引入 jQuery 库 -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function(){
// 使用 keydown 事件
$(document).on('keydown', function(event) {
// event.key 是现代浏览器推荐的方式,可以获取到具体的键名
// event.keyCode 是旧方法,已被废弃
const keyName = event.key;
console.log(`keydown: 你按下了 ${keyName} 键`);
// 将事件添加到日志区域
$('#log').prepend(`<div class="log-entry">keydown: 按下了 [${keyName}] 键</div>`);
});
});
</script>
</body>
</html>
代码解析:

(图片来源网络,侵删)
$(document).ready(function(){ ... });: 确保整个 HTML 文档加载完毕后再执行 jQuery 代码。$(document).on('keydown', function(event){ ... });: 为整个文档绑定keydown事件,当文档中任何地方按下键盘时,这个匿名函数就会被执行。event: 这是事件对象,包含了关于事件的详细信息,比如按下的是哪个键、是否按下了修饰键(Ctrl, Alt, Shift)等。event.key: 这是获取按键名称的推荐属性("a", "Enter", "ArrowLeft"),它比旧的event.keyCode更直观、更国际化。$('#log').prepend(...): 将新的日志条目添加到#log元素的顶部。
区分 keydown 和 keyup
keydown 和 keyup 的区别非常直观:一个在按键按下时触发,一个在按键释放时触发。
$(document).ready(function(){
// keydown 事件
$(document).on('keydown', function(event) {
console.log(`按键 [${event.key}] 已按下`);
});
// keyup 事件
$(document).on('keyup', function(event) {
console.log(`按键 [${event.key}] 已释放`);
});
});
实践: 打开浏览器的开发者工具(F12),切换到 Console 标签页,然后运行上面的代码,现在你在键盘上按住一个键('A'),你会看到控制台先打印出 "按键 [a] 已按下",当你松开 'A' 键时,才会打印出 "按键 [a] 已释放"。
获取按键信息
event 对象提供了丰富的属性,让我们可以精确地知道用户按下了什么。
常用 event 属性:
| 属性 | 描述 | 示例 |
|---|---|---|
event.key |
推荐,按下的键的值。 | "a", "Enter", , "ArrowUp" |
event.code |
推荐,物理按键在键盘上的位置。 | "KeyA", "Enter", "Space", "ArrowUp" |
event.which |
已废弃,按下键的数字代码(keyCode 和 charCode 的组合)。 | 65 (A), 13 (Enter) |
event.keyCode |
已废弃,按下键的数字代码。 | 65 (A), 13 (Enter) |
event.altKey |
如果按下了 Alt 键,则为 true。 |
true 或 false |
event.ctrlKey |
如果按下了 Ctrl 键,则为 true。 |
true 或 false |
event.shiftKey |
如果按下了 Shift 键,则为 true。 |
true 或 false |
示例:检测组合键

(图片来源网络,侵删)
这是一个非常实用的例子,比如实现一个 "Ctrl + S" 保存功能。
$(document).on('keydown', function(event) {
// 检查是否同时按下了 Ctrl (或 Cmd) 和 S 键
// 注意:Mac 电脑上通常是 Cmd 键,event.metaKey 用来检测 Cmd
if ((event.ctrlKey || event.metaKey) && event.key === 's') {
// 阻止浏览器的默认行为(通常是“另存为”对话框)
event.preventDefault();
alert('保存操作被触发!');
console.log('Ctrl+S (或 Cmd+S) 被按下,已阻止默认保存行为。');
}
});
代码解析:
event.preventDefault(): 这是一个至关重要的方法,它会阻止事件的默认行为,在这个例子中,它阻止了浏览器默认的“保存页面”行为,让我们可以执行自己的自定义逻辑。event.ctrlKey: 检查 Ctrl 键是否被按下。event.metaKey: 检查 Cmd 键(Mac 上的 Command 键)是否被按下,为了跨平台兼容性,event.ctrlKey || event.metaKey一起使用。
事件委托
如果你需要为动态添加到页面上的元素(比如通过 AJAX 或 JavaScript 动态创建的输入框)绑定键盘事件,直接使用 $('#myInput').on(...) 是无效的,这时就需要事件委托。
事件委托的原理是:将事件监听器绑定到父元素上,然后利用事件冒泡机制,当子元素触发事件时,父元素也能捕获到事件,并通过 event.target 来判断是哪个子元素触发的。
示例:为动态列表项添加监听
<input type="text" id="newItemInput" placeholder="输入新任务,按回车添加">
<ul id="itemList">
<li>已有任务 1</li>
<li>已有任务 2</li>
</ul>
<script>
$(document).ready(function(){
// 绑定到父元素 #itemList 上
$('#itemList').on('keydown', 'li', function(event) {
// event.target 指向实际触发事件的 li 元素
if (event.key === 'Enter') {
const currentText = $(this).text();
alert(`你确认要完成任务: "${currentText}" 吗?`);
}
});
// 动态添加新任务的示例
$('#newItemInput').on('keypress', function(e) {
if (e.key === 'Enter') {
const newItem = $('<li>').text($(this).val());
$('#itemList').append(newItem);
$(this).val(''); // 清空输入框
}
});
});
</script>
代码解析:
$('#itemList').on('keydown', 'li', function(event){ ... });: 这就是事件委托的语法。#itemList: 事件监听器绑定的父元素。'keydown': 要监听的事件。'li': 选择器,用于筛选出我们关心的子元素,只有当事件是由li元素触发时,后面的处理函数才会执行。function(event){ ... }: 实际的事件处理函数。
event.target: 在处理函数内部,event.target始终指向最初触发该事件的元素(也就是那个被按下了回车的li)。
最佳实践和注意事项
- 使用
keydown而不是keypress:keypress已被废弃,并且它无法很好地处理功能键。keydown是最通用、最可靠的选择。 - 优先使用
event.key和event.code: 它们比event.keyCode更现代、更易读,并且支持 Unicode 字符。 - 善用
event.preventDefault(): 当你希望完全控制键盘行为(如表单提交、快捷键)时,一定要使用它来阻止浏览器默认行为。 - 考虑性能: 不要在
keydown事件中执行耗时很长的操作(如复杂的 DOM 操作、AJAX 请求),因为用户可能会快速连续按键,导致事件被频繁触发,造成卡顿。 - 明确监听范围: 尽量将键盘事件绑定到最具体的元素上,而不是整个
document,一个输入框的键盘事件应该绑定到输入框本身,而不是整个页面,这能避免不必要的触发,并让代码逻辑更清晰。
| 任务 | 方法/属性 | 示例 |
|---|---|---|
| 绑定按键按下事件 | .on('keydown', handler) |
$(document).on('keydown', myFunction); |
| 绑定按键释放事件 | .on('keyup', handler) |
$('#myInput').on('keyup', myFunction); |
| 获取按下的键名 | event.key |
if (event.key === 'Enter') { ... } |
| 获取物理按键位置 | event.code |
if (event.code === 'Space') { ... } |
| 检测组合键 | event.ctrlKey, event.shiftKey |
if (event.ctrlKey && event.key === 'a') { ... } |
| 阻止默认行为 | event.preventDefault() |
event.preventDefault(); |
| 为动态元素绑定事件 | 事件委托 | $('#parent').on('keydown', 'child', handler); |
掌握了这些知识点,你就可以轻松应对网页中绝大多数的键盘交互需求了。
