Tôi đã xem qua các câu trả lời ở trên và cách tiếp cận keydown
/ đề xuất keyup
chỉ hoạt động trong những trường hợp đặc biệt. Nếu người dùng nhấn phím tắt hoặc sử dụng cử chỉ phím để mở cửa sổ hoặc tab trình duyệt mới, thì a keydown
sẽ được đăng ký, điều này tốt, vì tại thời điểm đó, không thể biết liệu khóa có phải là thứ mà ứng dụng web đang theo dõi hay không hoặc là một trình duyệt hoặc phím tắt hệ điều hành tiêu chuẩn. Quay lại trang trình duyệt, nó sẽ vẫn nghĩ rằng khóa được giữ, mặc dù nó đã được phát hành trong thời gian chờ đợi. Hoặc một số phím được giữ đơn giản trong khi người dùng đang chuyển sang tab hoặc ứng dụng khác bằng chuột, sau đó được phát hành ra bên ngoài trang của chúng tôi.
Các phím bổ trợ ( Shift
v.v.) có thể được giám sát thông qua, mousemove
v.v. giả sử rằng có ít nhất một tương tác chuột được mong đợi khi tab quay lại, điều này thường xảy ra.
Đối với hầu hết tất cả các phím khác (trừ bổ, Tab
, Delete
, nhưng bao gồm Space
, Enter
), giám sát keypress
sẽ làm việc cho hầu hết các ứng dụng - một chìa khóa giữ xuống sẽ tiếp tục cháy. Tuy nhiên, có một số độ trễ trong việc đặt lại khóa, do tính định kỳ của keypress
việc kích hoạt. Về cơ bản, nếu keypress
không tiếp tục bắn, thì có thể loại trừ hầu hết các phím. Điều này, kết hợp với các công cụ sửa đổi khá kín gió, mặc dù tôi chưa khám phá những gì phải làm với Tab
và Backspace
.
Tôi chắc rằng có một thư viện nào đó ngoài kia tóm tắt về điểm yếu này của DOM, hoặc có thể một số thay đổi tiêu chuẩn DOM đã giải quyết vấn đề đó, vì đó là một câu hỏi khá cũ.