onkeydown事件是JavaScript中用於監聽鍵盤按鍵按下動作的事件。當用户按下鍵盤上的任意鍵時,會觸發這個事件。與onkeypress事件不同的是,onkeydown事件會響應所有按鍵(包括功能鍵如Ctrl、Shift、方向鍵等),而不僅僅是字符鍵。
事件觸發順序
鍵盤按鍵操作會按以下順序觸發事件:
onkeydown -> onkeypress -> onkeyup
事件綁定方式
1. HTML屬性方式(不推薦)
<input type="text" onkeydown="handleKeyDown(event)">
2. JavaScript屬性方式
document.onkeydown = function(event) {
// 處理邏輯
};
3. 推薦的addEventListener方式(最佳實踐)
document.addEventListener('keydown', function(event) {
// 處理邏輯
});
事件對象的關鍵屬性
|
屬性
|
説明
|
示例
|
|
|
獲取按鍵名稱(如"Enter", "a", "ArrowUp")
|
|
|
|
獲取按鍵的ASCII碼值(瀏覽器差異:IE用keyCode,其他用which)
|
|
|
|
獲取按鍵編碼值(其他瀏覽器使用)
|
|
|
|
檢測是否按下了Ctrl鍵
|
|
|
|
檢測是否按下了Shift鍵
|
|
代碼例子
示例1:簡單按鍵檢測
<!DOCTYPE html>
<html>
<head>
<title>onkeydown示例</title>
</head>
<body>
<h2>按任意鍵查看按鍵信息</h2>
<input type="text" placeholder="按任意鍵測試">
<script>
// 使用推薦的addEventListener方式
document.addEventListener('keydown', function(event) {
console.log(`按鍵被按下: ${event.key} (keyCode: ${event.keyCode})`);
// 檢測Enter鍵
if (event.key === 'Enter') {
alert('你按下了Enter鍵!');
}
// 檢測Ctrl+Enter組合鍵
if (event.ctrlKey && event.key === 'Enter') {
alert('你按下了Ctrl+Enter組合鍵!');
}
});
</script>
</body>
</html>
示例2:輸入框限制輸入數字
<!DOCTYPE html>
<html>
<head>
<title>輸入框限制數字示例</title>
</head>
<body>
<h2>輸入框限制輸入數字</h2>
<input type="text" placeholder="只能輸入字母">
<script>
document.querySelector('input').addEventListener('keydown', function(event) {
// 檢測是否是數字鍵
var isDigit = /^[0-9]$/.test(event.key);
// 如果是數字鍵,阻止默認行為
if (isDigit) {
event.preventDefault();
alert('輸入框不允許輸入數字!');
}
});
</script>
</body>
</html>
示例3:使用鍵盤控制焦點(上下左右鍵)
<!DOCTYPE html>
<html>
<head>
<title>鍵盤焦點控制示例</title>
</head>
<body>
<h2>使用方向鍵控制焦點</h2>
<div>
<input type="text" placeholder="輸入框1">
<input type="text" placeholder="輸入框2">
<input type="text" placeholder="輸入框3">
</div>
<script>
document.addEventListener('keydown', function(event) {
const inputs = document.querySelectorAll('input');
const focusedElement = document.activeElement;
let currentIndex = Array.from(inputs).indexOf(focusedElement);
if (currentIndex === -1) return; // 沒有焦點元素
let nextIndex = currentIndex;
switch (event.key) {
case 'ArrowUp':
nextIndex = Math.max(0, currentIndex - 1);
break;
case 'ArrowDown':
nextIndex = Math.min(inputs.length - 1, currentIndex + 1);
break;
case 'ArrowLeft':
nextIndex = Math.max(0, currentIndex - 1);
break;
case 'ArrowRight':
nextIndex = Math.min(inputs.length - 1, currentIndex + 1);
break;
default:
return;
}
inputs[nextIndex].focus();
event.preventDefault(); // 阻止默認行為
});
</script>
</body>
</html>
注意事項
- 瀏覽器兼容性:不同瀏覽器對
keyCode和which的處理略有差異,推薦使用event.key獲取按鍵名稱。 - 事件冒泡:鍵盤事件會冒泡,可以使用
event.stopPropagation()阻止事件傳播。 - 輸入法問題:在中文輸入法環境下,
keydown事件可能會在輸入法編輯器(IME)中觸發多次,可以使用event.code來獲取更準確的按鍵信息。 - 性能考慮:如果處理函數執行時間較長,可能會導致連續按鍵時的延遲,建議優化處理函數或使用防抖(debounce)和節流(throttle)技術。