Chụp phím bấm mà không cần đặt thành phần đầu vào trên trang?


77

Làm cách nào để ghi lại thao tác nhấn phím, ví dụ: Ctrl + Z, mà không cần đặt một phần tử đầu vào trên trang trong JavaScript? Có vẻ như trong IE, các sự kiện nhấn phím và gõ phím chỉ có thể được liên kết với các phần tử đầu vào (hộp nhập, vùng văn bản, v.v.)


5
@Tim: Bởi vì việc thực hiện các hành động khi các tổ hợp phím đó được nhấn khi một phần tử GUI không được lấy nét sẽ là không bình thường, do đó vi phạm Nguyên tắc Ít bất ngờ nhất.
Lightness Races in Orbit vào

5
@Tomalak: Có những phần tử khác mà người ta có thể muốn xử lý các sự kiện chính một cách hợp lý, chẳng hạn như <canvas>, mặc dù tôi đồng ý rằng bất kỳ phần tử nào như vậy đều phải có tiêu điểm trước khi tạo ra các sự kiện chính. Việc sử dụng một tabindexthuộc tính sẽ cho phép một phần tử nhận được tiêu điểm nếu không thể.
Tim Down

2
Tôi muốn giới thiệu thư viện javascript Keypress: dmauro.github.io/Keypress
xinthose,

1
Một lý do khác để nắm bắt đầu vào bàn phím là nếu mã vạch chỉ hiển thị trên màn hình và sử dụng máy quét mã vạch làm đầu vào bàn phím. Mà tôi đang làm.
Robert,

Hầu hết các ứng dụng đều có phím tắt mà không có tiêu điểm nhập liệu. Thông thường. Lấy CTRL-Z có nghĩa là UNDO chẳng hạn.
Epirocks

Câu trả lời:


41

jQuery cũng có một triển khai tuyệt vời cực kỳ dễ sử dụng. Đây là cách bạn có thể triển khai chức năng này trên các trình duyệt:

$(document).keypress(function(e){
    var checkWebkitandIE=(e.which==26 ? 1 : 0);
    var checkMoz=(e.which==122 && e.ctrlKey ? 1 : 0);

    if (checkWebkitandIE || checkMoz) $("body").append("<p>ctrl+z detected!</p>");
});

Đã thử nghiệm trong IE7, Firefox 3.6.3 & Chrome 4.1.249.1064

Một cách khác để làm điều này là sử dụng sự kiện keydown và theo dõi event.keyCode. Tuy nhiên, vì jQuery chuẩn hóa keyCode và charCode bằng event.which, thông số kỹ thuật của họ khuyên bạn nên sử dụng event.which trong nhiều trường hợp:

$(document).keydown(function(e){
if (e.keyCode==90 && e.ctrlKey)
    $("body").append("<p>ctrl+z detected!</p>");
});

1
không biết e.which có thể nắm bắt tổ hợp phím cũng như nhấp chuột! Và bạn có thể cho tôi biết cách lấy mã số 26 không?
powerboy

2
mã khóa 26 là một id cụ thể cho "cái" được đặt bởi sự kiện nhấn phím (biểu thị CTRL + z). Để xem thêm ánh xạ ký tự cho sự kiện nhấn phím, hãy xem tài liệu jQuery hoặc trình kiểm tra sự kiện chính của
unixpapa

Cám ơn. Tôi biết ý nghĩa của mã khóa là gì. Ý tôi là, 17 là Ctrl, 90 là Z, vậy làm thế nào bạn có được số 26? Tôi vừa tìm kiếm nhưng không thể tìm thấy câu trả lời.
powerboy

Sử dụng các liên kết tôi đưa vào bình luận của mình để kiểm tra mã cho các lần nhấn phím khác nhau.
Trafalmadorian

2
Tôi không nghĩ câu hỏi là về jQuery. Hoàn toàn không cần thiết phải tải một thư viện cho việc này. Đây là cách mà thế hệ lập trình viên mới không còn biết cách viết mã nữa.
FlorianB

68

Đối với các phím không thể in được, chẳng hạn như phím mũi tên và phím tắt như Ctrl-z, Ctrl-x, Ctrl-c có thể kích hoạt một số hành động trong trình duyệt (ví dụ: bên trong tài liệu hoặc phần tử có thể chỉnh sửa), bạn có thể không nhận được phím bấm sự kiện trong tất cả các trình duyệt. Vì lý do này, bạn phải sử dụng keydownthay thế, nếu bạn muốn ngăn chặn hành động mặc định của trình duyệt. Nếu không, keyupsẽ làm tốt.

Đính kèm một keydownsự kiện để documenthoạt động trong tất cả các trình duyệt chính:

document.onkeydown = function(evt) {
    evt = evt || window.event;
    if (evt.ctrlKey && evt.keyCode == 90) {
        alert("Ctrl-Z");
    }
};

Để có tài liệu tham khảo đầy đủ, tôi thực sự giới thiệu bài viết của Jan Wolter về xử lý khóa JavaScript .


@hendrik: Tôi không hiểu tại sao nó không nên nhưng tôi hiện không thể kiểm tra nó.
Tim Down


16

Phát hiện phím bấm, bao gồm các tổ hợp phím:

window.addEventListener('keydown', function (e) {
  if (e.ctrlKey && e.keyCode == 90) {
    // Ctrl + z pressed
  }
});

Lợi ích ở đây là bạn không ghi đè lên bất kỳ thuộc tính toàn cục nào, mà thay vào đó chỉ là giới thiệu một tác dụng phụ. Không tốt, nhưng chắc chắn ít bất chính hơn rất nhiều so với các đề xuất khác ở đây.


8

Mã & phát hiện ctrl + z

document.onkeyup = function(e) {
  if(e.ctrlKey && e.keyCode == 90) {
    // ctrl+z pressed
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.