Practical Examples
Here are real-world examples of how to use the Keycode Info tool and KeyboardEvent API in your projects.
Basic Key Detection
Simple Key Logger
document.addEventListener('keydown', (event) => {
console.log(`Key: ${event.key}, Code: ${event.code}, KeyCode: ${event.keyCode}`);
});
Key Information Display
function displayKeyInfo(event) {
const info = {
key: event.key,
code: event.code,
keyCode: event.keyCode,
location: event.location,
modifiers: {
ctrl: event.ctrlKey,
alt: event.altKey,
shift: event.shiftKey,
meta: event.metaKey,
},
};
console.table(info);
}
document.addEventListener('keydown', displayKeyInfo);
Keyboard Shortcuts
Global Shortcuts
document.addEventListener('keydown', (event) => {
// Ctrl+S (Save)
if (event.ctrlKey && event.key === 's') {
event.preventDefault();
saveDocument();
}
// Ctrl+Z (Undo)
if (event.ctrlKey && event.key === 'z') {
event.preventDefault();
undoAction();
}
// Ctrl+Y (Redo)
if (event.ctrlKey && event.key === 'y') {
event.preventDefault();
redoAction();
}
});
Application Shortcuts
class KeyboardShortcuts {
constructor() {
this.shortcuts = new Map();
this.setupEventListeners();
}
addShortcut(keys, callback) {
this.shortcuts.set(keys, callback);
}
setupEventListeners() {
document.addEventListener('keydown', (event) => {
const key = this.getKeyString(event);
const callback = this.shortcuts.get(key);
if (callback) {
event.preventDefault();
callback(event);
}
});
}
getKeyString(event) {
const modifiers = [];
if (event.ctrlKey) modifiers.push('Ctrl');
if (event.altKey) modifiers.push('Alt');
if (event.shiftKey) modifiers.push('Shift');
if (event.metaKey) modifiers.push('Meta');
return [...modifiers, event.key].join('+');
}
}
// Usage
const shortcuts = new KeyboardShortcuts();
shortcuts.addShortcut('Ctrl+N', () => console.log('New document'));
shortcuts.addShortcut('Ctrl+O', () => console.log('Open document'));
shortcuts.addShortcut('Ctrl+S', () => console.log('Save document'));
Game Controls
Arrow Key Movement
class GameControls {
constructor() {
this.keys = new Set();
this.setupEventListeners();
}
setupEventListeners() {
document.addEventListener('keydown', (event) => {
this.keys.add(event.code);
});
document.addEventListener('keyup', (event) => {
this.keys.delete(event.code);
});
}
isPressed(keyCode) {
return this.keys.has(keyCode);
}
getMovement() {
const movement = { x: 0, y: 0 };
if (this.isPressed('ArrowLeft') || this.isPressed('KeyA')) {
movement.x = -1;
}
if (this.isPressed('ArrowRight') || this.isPressed('KeyD')) {
movement.x = 1;
}
if (this.isPressed('ArrowUp') || this.isPressed('KeyW')) {
movement.y = -1;
}
if (this.isPressed('ArrowDown') || this.isPressed('KeyS')) {
movement.y = 1;
}
return movement;
}
}
// Usage
const controls = new GameControls();
setInterval(() => {
const movement = controls.getMovement();
if (movement.x !== 0 || movement.y !== 0) {
console.log('Moving:', movement);
}
}, 16); // 60 FPS
WASD Controls
class WASDControls {
constructor() {
this.keys = {
w: false,
a: false,
s: false,
d: false,
space: false,
shift: false,
};
this.setupEventListeners();
}
setupEventListeners() {
document.addEventListener('keydown', (event) => {
switch (event.code) {
case 'KeyW':
this.keys.w = true;
break;
case 'KeyA':
this.keys.a = true;
break;
case 'KeyS':
this.keys.s = true;
break;
case 'KeyD':
this.keys.d = true;
break;
case 'Space':
this.keys.space = true;
break;
case 'ShiftLeft':
case 'ShiftRight':
this.keys.shift = true;
break;
}
});
document.addEventListener('keyup', (event) => {
switch (event.code) {
case 'KeyW':
this.keys.w = false;
break;
case 'KeyA':
this.keys.a = false;
break;
case 'KeyS':
this.keys.s = false;
break;
case 'KeyD':
this.keys.d = false;
break;
case 'Space':
this.keys.space = false;
break;
case 'ShiftLeft':
case 'ShiftRight':
this.keys.shift = false;
break;
}
});
}
getState() {
return { ...this.keys };
}
}
Form Validation
Real-time Validation
class FormValidator {
constructor(formElement) {
this.form = formElement;
this.setupEventListeners();
}
setupEventListeners() {
this.form.addEventListener('keydown', (event) => {
if (event.key === 'Enter') {
event.preventDefault();
this.submitForm();
}
if (event.key === 'Escape') {
this.clearForm();
}
});
this.form.addEventListener('keyup', (event) => {
this.validateField(event.target);
});
}
validateField(field) {
const value = field.value;
const type = field.type;
switch (type) {
case 'email':
this.validateEmail(value, field);
break;
case 'tel':
this.validatePhone(value, field);
break;
case 'password':
this.validatePassword(value, field);
break;
}
}
validateEmail(email, field) {
const isValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
this.setFieldState(field, isValid);
}
validatePhone(phone, field) {
const isValid = /^\+?[\d\s-()]+$/.test(phone);
this.setFieldState(field, isValid);
}
validatePassword(password, field) {
const isValid = password.length >= 8;
this.setFieldState(field, isValid);
}
setFieldState(field, isValid) {
field.classList.toggle('valid', isValid);
field.classList.toggle('invalid', !isValid);
}
submitForm() {
const isValid = this.form.checkValidity();
if (isValid) {
console.log('Form submitted');
} else {
console.log('Form has errors');
}
}
clearForm() {
this.form.reset();
this.form.querySelectorAll('.valid, .invalid').forEach((field) => {
field.classList.remove('valid', 'invalid');
});
}
}
Accessibility Features
Keyboard Navigation
class KeyboardNavigation {
constructor() {
this.focusableElements = [];
this.currentIndex = 0;
this.setupEventListeners();
}
setupEventListeners() {
document.addEventListener('keydown', (event) => {
switch (event.key) {
case 'Tab':
event.preventDefault();
this.navigateNext();
break;
case 'Shift':
if (event.key === 'Tab') {
event.preventDefault();
this.navigatePrevious();
}
break;
case 'Enter':
case ' ':
this.activateCurrent();
break;
case 'Escape':
this.blurCurrent();
break;
}
});
}
updateFocusableElements() {
this.focusableElements = Array.from(
document.querySelectorAll(
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])',
),
);
}
navigateNext() {
this.currentIndex = (this.currentIndex + 1) % this.focusableElements.length;
this.focusCurrent();
}
navigatePrevious() {
this.currentIndex =
this.currentIndex === 0 ? this.focusableElements.length - 1 : this.currentIndex - 1;
this.focusCurrent();
}
focusCurrent() {
this.updateFocusableElements();
if (this.focusableElements[this.currentIndex]) {
this.focusableElements[this.currentIndex].focus();
}
}
activateCurrent() {
const current = this.focusableElements[this.currentIndex];
if (current) {
current.click();
}
}
blurCurrent() {
if (document.activeElement) {
document.activeElement.blur();
}
}
}
Debugging Tools
Key Event Logger
class KeyEventLogger {
constructor() {
this.events = [];
this.setupEventListeners();
}
setupEventListeners() {
document.addEventListener('keydown', (event) => {
this.logEvent('keydown', event);
});
document.addEventListener('keyup', (event) => {
this.logEvent('keyup', event);
});
}
logEvent(type, event) {
const logEntry = {
type,
timestamp: Date.now(),
key: event.key,
code: event.code,
keyCode: event.keyCode,
location: event.location,
modifiers: {
ctrl: event.ctrlKey,
alt: event.altKey,
shift: event.shiftKey,
meta: event.metaKey,
},
};
this.events.push(logEntry);
console.log('Key Event:', logEntry);
}
getEvents() {
return [...this.events];
}
clearEvents() {
this.events = [];
}
exportEvents() {
const data = JSON.stringify(this.events, null, 2);
const blob = new Blob([data], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'key-events.json';
a.click();
URL.revokeObjectURL(url);
}
}
Integration with Keycode Info Tool
Custom Key Display
class CustomKeyDisplay {
constructor(container) {
this.container = container;
this.setupEventListeners();
}
setupEventListeners() {
document.addEventListener('keydown', (event) => {
this.displayKeyInfo(event);
});
}
displayKeyInfo(event) {
const keyInfo = {
key: event.key,
code: event.code,
keyCode: event.keyCode,
location: event.location,
modifiers: this.getModifiers(event),
};
this.container.innerHTML = `
<div class="key-display">
<div class="key-name">${keyInfo.key}</div>
<div class="key-details">
<div>Code: ${keyInfo.code}</div>
<div>KeyCode: ${keyInfo.keyCode}</div>
<div>Location: ${keyInfo.location}</div>
<div>Modifiers: ${keyInfo.modifiers}</div>
</div>
</div>
`;
}
getModifiers(event) {
const modifiers = [];
if (event.ctrlKey) modifiers.push('Ctrl');
if (event.altKey) modifiers.push('Alt');
if (event.shiftKey) modifiers.push('Shift');
if (event.metaKey) modifiers.push('Meta');
return modifiers.join(' + ') || 'None';
}
}
// Usage
const display = new CustomKeyDisplay(document.getElementById('key-display'));
These examples demonstrate practical applications of the KeyboardEvent API and how the Keycode Info tool can help you understand and debug keyboard interactions in your web applications.