Keyboard properties là tập hợp các thuộc tính và phương thức liên quan đến bàn phím trong lập trình web và phát triển ứng dụng. Việc nắm vững cách sử dụng keyboard properties giúp lập trình viên kiểm soát sự kiện bàn phím, xử lý tổ hợp phím và tối ưu hóa tương tác người dùng. Bài viết này sẽ hướng dẫn chi tiết từ khái niệm cơ bản đến ứng dụng nâng cao của keyboard properties trong JavaScript, React và các framework phổ biến.
Keyboard properties là gì và tại sao cần hiểu rõ?

Keyboard properties là các thuộc tính của đối tượng sự kiện bàn phím (KeyboardEvent) trong JavaScript, cung cấp thông tin về phím được nhấn, trạng thái phím modifier và hành vi của sự kiện. Khi người dùng tương tác với bàn phím, trình duyệt tạo ra các sự kiện keydown, keypress và keyup, mỗi sự kiện đều chứa keyboard properties để mô tả chi tiết hành động.
Hiểu rõ cách sử dụng keyboard properties giúp xây dựng ứng dụng web có khả năng phản hồi nhanh, hỗ trợ phím tắt và cải thiện khả năng tiếp cận cho người dùng khuyết tật. Các ứng dụng phổ biến bao gồm game nhập liệu, trình soạn thảo văn bản, ứng dụng văn phòng trực tuyến và hệ thống quản lý nội dung.
Các thuộc tính quan trọng trong keyboard properties
Thuộc tính key
Thuộc tính key trả về giá trị ký tự của phím được nhấn, bao gồm cả ký tự đặc biệt và phím chức năng. Ví dụ, khi nhấn phím ‘a’, key trả về ‘a’, khi nhấn Enter, key trả về ‘Enter’. Đây là thuộc tính được khuyến nghị sử dụng thay vì keyCode hay which vì tính nhất quán giữa các trình duyệt.
Thuộc tính code
Thuộc tính code trả về tên vật lý của phím trên bàn phím, không phụ thuộc vào ngôn ngữ hay layout. Ví dụ, phím ‘a’ ở vị trí thứ hai hàng dưới cùng bên trái luôn trả về ‘KeyA’, bất kể người dùng đang gõ tiếng Việt hay tiếng Anh. Điều này rất hữu ích khi xử lý game hoặc phím tắt không phụ thuộc ngôn ngữ.
Thuộc tính ctrlKey, shiftKey, altKey, metaKey
Các thuộc tính boolean này cho biết phím modifier có đang được giữ khi sự kiện xảy ra hay không. ctrlKey kiểm tra phím Control, shiftKey kiểm tra Shift, altKey kiểm tra Alt và metaKey kiểm tra phím Windows (hoặc Command trên macOS). Kết hợp các thuộc tính này với key hoặc code cho phép xử lý tổ hợp phím phức tạp.
Thuộc tính repeat
Thuộc tính repeat trả về true nếu phím đang được giữ và sự kiện lặp lại tự động. Điều này giúp phân biệt giữa nhấn phím một lần và giữ phím liên tục, rất quan trọng trong game hoặc ứng dụng nhập liệu.
Thuộc tính isComposing
Thuộc tính isComposing trả về true khi sự kiện đang trong quá trình soạn thảo văn bản phức tạp, ví dụ khi gõ tiếng Việt có dấu hoặc tiếng Trung Quốc. Sử dụng thuộc tính này giúp tránh xử lý sai khi người dùng đang nhập liệu với IME.
So sánh các thuộc tính keyboard properties

| Thuộc tính | Giá trị trả về | Ưu điểm | Nhược điểm |
|---|---|---|---|
| key | Chuỗi ký tự | Nhất quán, dễ đọc | Phụ thuộc layout bàn phím |
| code | Chuỗi tên phím | Không phụ thuộc layout | Không phản ánh ký tự thực tế |
| keyCode | Số nguyên | Tương thích cũ | Không chuẩn hóa, deprecated |
| which | Số nguyên | Tương thích cũ | Không chuẩn hóa, deprecated |
Cách sử dụng keyboard properties trong JavaScript
Lắng nghe sự kiện bàn phím cơ bản
Để bắt đầu sử dụng keyboard properties, cần đăng ký event listener cho sự kiện keydown, keypress hoặc keyup. Sự kiện keydown xảy ra khi phím được nhấn xuống, keyup khi thả phím ra, còn keypress xảy ra giữa hai sự kiện này nhưng chỉ với phím tạo ký tự.
Ví dụ đơn giản lấy thông tin phím nhấn:
document.addEventListener(‘keydown’, function(event) {
console.log(‘Phím nhấn:’, event.key);
console.log(‘Mã phím:’, event.code);
console.log(‘Ctrl:’, event.ctrlKey);
console.log(‘Shift:’, event.shiftKey);
});
Xử lý tổ hợp phím tắt
Kết hợp keyboard properties với phím modifier cho phép tạo phím tắt mạnh mẽ. Ví dụ xử lý Ctrl+S để lưu:
document.addEventListener(‘keydown’, function(event) {
if (event.ctrlKey && event.key === ‘s’) {
event.preventDefault();
saveDocument();
}
});
Phân biệt giữa key và code
Khi cần xử lý theo ký tự người dùng muốn nhập, sử dụng event.key. Khi cần xử lý theo vị trí phím vật lý, sử dụng event.code. Ví dụ trong game, người dùng bấm phím ‘W’ để đi lên, sử dụng event.code === ‘KeyW’ để đảm bảo hoạt động trên mọi layout bàn phím.
Ứng dụng keyboard properties trong React

Xử lý sự kiện trong component
Trong React, keyboard properties được sử dụng thông qua props onKeyDown, onKeyPress và onKeyUp. Các thuộc tính này hoạt động tương tự như DOM events nhưng được quản lý bởi hệ thống sự kiện tổng hợp của React.
Ví dụ component input xử lý phím Enter:
function SearchInput() {
const handleKeyDown = (event) => {
if (event.key === ‘Enter’) {
performSearch(event.target.value);
}
};
return <input onKeyDown={handleKeyDown} />;
}
Sử dụng useRef và useEffect cho phím tắt toàn cục
Để xử lý phím tắt ở cấp độ ứng dụng, kết hợp useEffect với event listener trên document:
useEffect(() => {
const handleKeyDown = (event) => {
if (event.ctrlKey && event.key === ‘k’) {
openCommandPalette();
}
};
document.addEventListener(‘keydown’, handleKeyDown);
return () => document.removeEventListener(‘keydown’, handleKeyDown);
}, []);
Các sai lầm thường gặp khi sử dụng keyboard properties
Sử dụng keyCode thay vì key
Nhiều lập trình viên vẫn sử dụng event.keyCode mặc dù thuộc tính này đã bị deprecated. keyCode không nhất quán giữa các trình duyệt và không hỗ trợ đầy đủ các phím đặc biệt. Chuyển sang sử dụng event.key hoặc event.code để đảm bảo tương thích.
Không xử lý sự kiện mặc định
Khi sử dụng phím tắt, cần gọi event.preventDefault() để ngăn trình duyệt thực hiện hành động mặc định. Ví dụ Ctrl+S mặc định mở hộp thoại lưu trang, nếu không ngăn chặn sẽ gây xung đột với chức năng lưu của ứng dụng.
Bỏ qua thuộc tính repeat
Khi người dùng giữ phím, sự kiện keydown lặp lại nhiều lần. Nếu không kiểm tra event.repeat, ứng dụng có thể xử lý nhiều lần không mong muốn, đặc biệt trong game hoặc ứng dụng nhập liệu.
Không xử lý isComposing
Khi người dùng gõ tiếng Việt hoặc ngôn ngữ có dấu, IME tạo ra sự kiện keydown với isComposing = true. Nếu không kiểm tra, ứng dụng có thể xử lý sai tổ hợp phím đang soạn thảo.
Lợi ích của việc sử dụng keyboard properties đúng cách

Sử dụng keyboard properties chính xác mang lại nhiều lợi ích cho ứng dụng web. Trải nghiệm người dùng được cải thiện rõ rệt với phím tắt nhanh chóng và phản hồi tức thì. Khả năng tiếp cận được nâng cao khi người dùng khuyết tật có thể tương tác bằng bàn phím thay vì chuột.
Hiệu suất ứng dụng cũng được tối ưu khi xử lý sự kiện đúng cách, tránh các lỗi không mong muốn. Các ứng dụng phức tạp như trình soạn thảo văn bản, IDE trực tuyến hay game web đều phụ thuộc lớn vào việc xử lý keyboard properties chính xác.
Hướng dẫn chi tiết cách sử dụng keyboard properties cho từng trường hợp
Xử lý phím tắt trong ứng dụng văn phòng
Đối với ứng dụng soạn thảo văn bản, cần xử lý nhiều tổ hợp phím như Ctrl+B (in đậm), Ctrl+I (in nghiêng), Ctrl+U (gạch chân). Sử dụng event.ctrlKey kết hợp với event.key để kiểm tra:
if (event.ctrlKey && event.key === ‘b’) {
event.preventDefault();
toggleBold();
}
Xử lý điều khiển game
Trong game, sử dụng event.code để đảm bảo phím điều khiển hoạt động trên mọi layout. Ví dụ game bắn súng sử dụng WASD để di chuyển:
if (event.code === ‘KeyW’) moveForward();
if (event.code === ‘KeyA’) moveLeft();
if (event.code === ‘KeyS’) moveBackward();
if (event.code === ‘KeyD’) moveRight();
Xử lý nhập liệu đa ngôn ngữ
Khi người dùng gõ tiếng Việt, kiểm tra event.isComposing để tránh xử lý sai:
if (event.isComposing) return;
if (event.key === ‘Enter’) submitForm();
Câu hỏi thường gặp về cách sử dụng keyboard properties

Sự khác biệt giữa keydown và keypress là gì?
Keydown xảy ra khi bất kỳ phím nào được nhấn, bao gồm phím chức năng và phím modifier. Keypress chỉ xảy ra với phím tạo ký tự và đã bị deprecated trong các tiêu chuẩn mới. Nên sử dụng keydown cho hầu hết trường hợp.
Làm thế nào để phát hiện phím Caps Lock?
Sử dụng event.getModifierState(‘CapsLock’) để kiểm tra trạng thái Caps Lock. Phương thức này trả về true nếu Caps Lock đang bật.
Có thể sử dụng keyboard properties trong mobile không?
Keyboard properties hoạt động trên mobile khi người dùng kết nối bàn phím ngoài hoặc sử dụng bàn phím ảo. Tuy nhiên, một số thuộc tính như code có thể không chính xác trên bàn phím ảo.
Tại sao event.key trả về undefined?
Event.key trả về undefined khi sự kiện không phải là KeyboardEvent hoặc khi sử dụng trình duyệt cũ không hỗ trợ. Kiểm tra loại sự kiện và cập nhật trình duyệt để khắc phục.
Làm thế nào để xử lý nhiều phím cùng lúc?
Lưu trạng thái các phím đang nhấn trong một object hoặc Set, cập nhật khi keydown và keyup. Kiểm tra object này trong game loop hoặc requestAnimationFrame để xử lý đồng thời.
Lưu ý quan trọng khi sử dụng keyboard properties
Luôn kiểm tra sự tồn tại của event trước khi truy cập thuộc tính để tránh lỗi undefined. Sử dụng event.preventDefault() một cách có chọn lọc, chỉ ngăn chặn hành động mặc định khi thực sự cần thiết để không ảnh hưởng đến trải nghiệm người dùng.
Kiểm tra tương thích trình duyệt khi sử dụng các thuộc tính mới như isComposing hoặc getModifierState. Các trình duyệt cũ có thể không hỗ trợ đầy đủ keyboard properties, cần có fallback phù hợp.
Khi xử lý phím tắt, ưu tiên sử dụng tổ hợp phím phổ biến và tránh xung đột với phím tắt mặc định của trình duyệt. Cung cấp tùy chọn tùy chỉnh phím tắt cho người dùng nâng cao.
Kết luận
Cách sử dụng keyboard properties là kỹ năng thiết yếu cho mọi lập trình viên web. Nắm vững các thuộc tính key, code, ctrlKey, shiftKey, altKey, metaKey, repeat và isComposing giúp xây dựng ứng dụng tương tác mạnh mẽ và thân thiện với người dùng. Áp dụng đúng kỹ thuật xử lý sự kiện, tránh các sai lầm phổ biến và luôn cập nhật tiêu chuẩn mới sẽ đảm bảo ứng dụng hoạt động ổn định trên mọi nền tảng.
Việc thực hành thường xuyên với các ví dụ thực tế và kiểm tra trên nhiều trình duyệt khác nhau giúp củng cố kiến thức về keyboard properties. Đầu tư thời gian tìm hiểu sâu về chủ đề này mang lại lợi ích lâu dài cho sự nghiệp phát triển web chuyên nghiệp.







