KeyboardEvent

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

* Some parts of this feature may have varying levels of support.

Các đối tượng KeyboardEvent mô tả tương tác của người dùng với bàn phím; mỗi sự kiện mô tả một tương tác đơn lẻ giữa người dùng và một phím (hoặc tổ hợp phím với các phím bổ trợ) trên bàn phím. Loại sự kiện (keydown, keypress, hoặc keyup) xác định loại hoạt động bàn phím nào đã xảy ra.

Note: Các sự kiện KeyboardEvent chỉ cho biết tương tác nào mà người dùng đã thực hiện với một phím trên bàn phím ở mức thấp, không cung cấp ý nghĩa ngữ cảnh cho tương tác đó. Khi bạn cần xử lý nhập văn bản, hãy sử dụng sự kiện input thay thế. Các sự kiện bàn phím có thể không được kích hoạt nếu người dùng đang sử dụng phương tiện nhập văn bản thay thế, chẳng hạn như hệ thống viết tay trên máy tính bảng hoặc bảng vẽ đồ họa.

Event UIEvent KeyboardEvent

Constructor

KeyboardEvent()

Tạo một đối tượng KeyboardEvent mới.

Hằng số

Giao diện KeyboardEvent định nghĩa các hằng số sau.

Vị trí bàn phím

Các hằng số sau xác định sự kiện phím bắt nguồn từ phần nào của bàn phím. Chúng được truy cập dưới dạng KeyboardEvent.DOM_KEY_LOCATION_STANDARD, v.v.

Các định danh vị trí bàn phím
Hằng số Giá trị Mô tả
DOM_KEY_LOCATION_STANDARD 0x00

Phím được mô tả bởi sự kiện không được xác định là nằm ở một khu vực cụ thể nào của bàn phím; nó không nằm trên bàn phím số (trừ khi đó là phím NumLock), và đối với các phím bị trùng lặp ở bên trái và bên phải bàn phím, phím đó vì lý do nào đó không được liên kết với vị trí đó.

Ví dụ bao gồm các phím chữ và số trên bàn phím PC 101 US tiêu chuẩn, phím NumLock và phím cách.

DOM_KEY_LOCATION_LEFT 0x01

Phím là một phím có thể tồn tại ở nhiều vị trí trên bàn phím và trong trường hợp này, nó nằm ở bên trái của bàn phím.

Ví dụ bao gồm phím Control trái, phím Command trái trên bàn phím Macintosh, hoặc phím Shift trái.

DOM_KEY_LOCATION_RIGHT 0x02

Phím là một phím có thể tồn tại ở nhiều vị trí trên bàn phím và trong trường hợp này, nó nằm ở bên phải của bàn phím.

Ví dụ bao gồm phím Shift phải và phím Alt phải (Option trên bàn phím Mac).

DOM_KEY_LOCATION_NUMPAD 0x03

Phím nằm trên bàn phím số, hoặc là một phím ảo được liên kết với bàn phím số nếu có nhiều hơn một nơi phím có thể bắt nguồn. Phím NumLock không thuộc nhóm này và luôn được mã hóa với vị trí DOM_KEY_LOCATION_STANDARD.

Ví dụ bao gồm các chữ số trên bàn phím số, phím Enter của bàn phím số, và dấu thập phân trên bàn phím số.

Thuộc tính instance

Giao diện này cũng kế thừa các thuộc tính từ cha của nó, UIEventEvent.

KeyboardEvent.altKey Read only

Trả về một giá trị boolean là true nếu phím Alt (Option hoặc trên macOS) đang hoạt động khi sự kiện bàn phím được tạo.

KeyboardEvent.code Read only

Trả về một chuỗi với giá trị mã của phím vật lý được biểu diễn bởi sự kiện.

Warning: Điều này bỏ qua bố cục bàn phím của người dùng, vì vậy nếu người dùng nhấn phím ở vị trí "Y" trong bố cục bàn phím QWERTY (gần giữa của hàng phía trên hàng home), điều này sẽ luôn trả về "KeyY", ngay cả khi người dùng có bàn phím QWERTZ (có nghĩa là người dùng mong đợi một "Z" và tất cả các thuộc tính khác sẽ cho biết một "Z") hoặc bố cục bàn phím Dvorak (nơi người dùng sẽ mong đợi một "F"). Nếu bạn muốn hiển thị các phím chính xác cho người dùng, bạn có thể sử dụng Keyboard.getLayoutMap().

KeyboardEvent.ctrlKey Read only

Trả về một giá trị boolean là true nếu phím Ctrl đang hoạt động khi sự kiện bàn phím được tạo.

KeyboardEvent.isComposing Read only

Trả về một giá trị boolean là true nếu sự kiện được kích hoạt sau compositionstart và trước compositionend.

KeyboardEvent.key Read only

Trả về một chuỗi biểu diễn giá trị phím của phím được biểu diễn bởi sự kiện.

KeyboardEvent.location Read only

Trả về một số biểu diễn vị trí của phím trên bàn phím hoặc thiết bị nhập liệu khác. Danh sách các hằng số xác định vị trí được hiển thị ở trên trong Vị trí bàn phím.

KeyboardEvent.metaKey Read only

Trả về một giá trị boolean là true nếu phím Meta (trên bàn phím Mac là phím ⌘ Command; trên bàn phím Windows là phím Windows ()) đang hoạt động khi sự kiện bàn phím được tạo.

KeyboardEvent.repeat Read only

Trả về một giá trị boolean là true nếu phím đang được giữ xuống đến mức nó đang tự động lặp lại.

KeyboardEvent.shiftKey Read only

Trả về một giá trị boolean là true nếu phím Shift đang hoạt động khi sự kiện bàn phím được tạo.

Các thuộc tính lỗi thời

KeyboardEvent.charCode Deprecated Read only

Trả về một số biểu diễn số tham chiếu Unicode của phím; thuộc tính này chỉ được sử dụng bởi sự kiện keypress. Trong Firefox 26, điều này trả về mã cho các ký tự có thể in.

KeyboardEvent.keyCode Deprecated Read only

Trả về một số biểu diễn mã số phụ thuộc hệ thống và triển khai xác định giá trị không thay đổi của phím đã nhấn.

KeyboardEvent.keyIdentifier Non-standard Deprecated Read only

Thuộc tính này không chuẩn và đã bị loại bỏ để thay thế bằng KeyboardEvent.key. Nó là một phần của phiên bản cũ của DOM Level 3 Events.

Phương thức instance

Giao diện này cũng kế thừa các phương thức từ cha của nó, UIEventEvent.

KeyboardEvent.getModifierState()

Trả về một giá trị boolean cho biết liệu phím bổ trợ như Alt, Shift, Ctrl, hoặc Meta, có được nhấn khi sự kiện được tạo hay không.

Phương thức lỗi thời

KeyboardEvent.initKeyboardEvent() Deprecated

Khởi tạo một đối tượng KeyboardEvent. Phương thức này hiện đã lỗi thời. Bạn nên sử dụng constructor KeyboardEvent() thay thế.

Sự kiện

Các sự kiện sau dựa trên loại KeyboardEvent. Trong danh sách dưới đây, mỗi sự kiện liên kết đến tài liệu cho trình xử lý sự kiện của Element, áp dụng chung cho tất cả các đối tượng nhận, bao gồm Element, Document, và Window.

keydown

Một phím đã được nhấn.

keyup

Một phím đã được nhả ra.

Sự kiện lỗi thời

keypress Deprecated

Một phím thường tạo ra giá trị ký tự đã được nhấn. Sự kiện này phụ thuộc nhiều vào thiết bị và đã lỗi thời. Bạn không nên sử dụng nó.

Ghi chú sử dụng

Có ba loại sự kiện bàn phím: keydown, keypress, và keyup. Đối với hầu hết các phím, Gecko gửi một chuỗi sự kiện bàn phím như sau:

  1. Khi phím được nhấn lần đầu, sự kiện keydown được gửi.
  2. Nếu phím không phải là phím bổ trợ, sự kiện keypress được gửi.
  3. Khi người dùng nhả phím, sự kiện keyup được gửi.

Trường hợp đặc biệt

Một số phím chuyển đổi trạng thái của đèn báo; chúng bao gồm các phím như Caps Lock, Num Lock và Scroll Lock. Trên Windows và Linux, các phím này chỉ gửi sự kiện keydownkeyup.

Note: Trên Linux, Firefox 12 và các phiên bản trước đó cũng gửi sự kiện keypress cho các phím này.

Tuy nhiên, một hạn chế của mô hình sự kiện macOS khiến Caps Lock chỉ gửi sự kiện keydown. Num Lock được hỗ trợ trên một số mẫu laptop cũ hơn (các mẫu từ 2007 trở về trước), nhưng kể từ đó, macOS không còn hỗ trợ Num Lock ngay cả trên bàn phím rời. Trên các MacBook cũ có phím Num Lock, phím đó không tạo ra bất kỳ sự kiện bàn phím nào. Gecko hỗ trợ phím Scroll Lock nếu bàn phím rời có phím F14 được kết nối. Trong một số phiên bản Firefox cũ hơn, phím này tạo ra sự kiện keypress; hành vi không nhất quán này là lỗi Firefox 602812.

Xử lý tự động lặp

Khi một phím được nhấn và giữ, nó bắt đầu tự động lặp lại. Điều này dẫn đến một chuỗi sự kiện tương tự như sau được gửi:

  1. keydown
  2. keypress
  3. keydown
  4. keypress
  5. <<lặp lại cho đến khi người dùng nhả phím>>
  6. keyup

Đây là những gì đặc tả DOM Level 3 quy định sẽ xảy ra. Tuy nhiên, có một số lưu ý, như mô tả dưới đây.

Tự động lặp trên một số môi trường GTK như Ubuntu 9.4

Trong một số môi trường dựa trên GTK, tự động lặp gửi một sự kiện key-up gốc tự động trong quá trình tự động lặp và không có cách nào để Gecko biết được sự khác biệt giữa một chuỗi nhấn phím lặp lại và một tự động lặp. Trên các nền tảng đó, một phím tự động lặp sẽ tạo ra chuỗi sự kiện sau:

  1. keydown
  2. keypress
  3. keyup
  4. keydown
  5. keypress
  6. keyup
  7. <<lặp lại cho đến khi người dùng nhả phím>>
  8. keyup

Trong các môi trường này, thật không may, không có cách nào cho nội dung web để phân biệt giữa phím tự động lặp và phím chỉ đang được nhấn lặp lại.

Ví dụ

js
document.addEventListener("keydown", (event) => {
  const keyName = event.key;

  if (keyName === "Control") {
    // không alert khi chỉ nhấn phím Control.
    return;
  }

  if (event.ctrlKey) {
    // Mặc dù event.key không phải là 'Control' (ví dụ, 'a' được nhấn),
    // event.ctrlKey có thể là true nếu phím Ctrl được nhấn cùng lúc.
    alert(`Tổ hợp ctrlKey + ${keyName}`);
  } else {
    alert(`Phím đã nhấn ${keyName}`);
  }
});

document.addEventListener("keyup", (event) => {
  const keyName = event.key;

  // Khi người dùng nhả phím Ctrl, phím không còn hoạt động,
  // nên event.ctrlKey là false.
  if (keyName === "Control") {
    alert("Phím Control đã được nhả");
  }
});

Đặc điểm kỹ thuật

Specification
UI Events
# interface-keyboardevent

Đặc tả giao diện KeyboardEvent đã trải qua nhiều phiên bản nháp, đầu tiên là DOM Events Level 2 nơi nó bị loại bỏ do không có sự đồng thuận, sau đó là DOM Events Level 3. Điều này dẫn đến việc triển khai các phương thức khởi tạo không chuẩn, phiên bản DOM Events Level 2 ban đầu, KeyboardEvent.initKeyEvent() bởi các trình duyệt Gecko và phiên bản DOM Events Level 3 ban đầu, KeyboardEvent.initKeyboardEvent() bởi các trình duyệt khác. Cả hai đã được thay thế bằng cách sử dụng constructor hiện đại: KeyboardEvent().

Tương thích trình duyệt

Ghi chú tương thích

  • Bắt đầu từ Firefox 65, sự kiện keypress không còn được kích hoạt cho các phím không in được (lỗi Firefox 968056), ngoại trừ phím Enter, và các tổ hợp phím Shift + EnterCtrl + Enter (các tổ hợp này được giữ lại cho mục đích tương thích chéo trình duyệt).

Xem thêm