2012-06-14 25 views
36

liên quan: JavaScript KeyCode vs CharCodenhấn và khóa - tại sao mã phím lại khác?

Dưới đây là một số mã bạn có thể thử tại nhà hoặc tại một jsfiddle:

el.addEventListener('keyup', function(e) { 
    console.log('Keyup event'); 
    console.log(e.keyCode); 
}); 
el.addEventListener('keypress', function(e) { 
    console.log('Keypress event'); 
    console.log(e.keyCode); 
}); 

Tại sao keyCode khác nhau?

Tôi có thể hiểu tại sao người ta chỉ nên sử dụng nhấn phím, nhưng những gì tôi không hiểu là hai sự kiện quan trọng, được cung cấp cùng một phím nhấn trên bàn phím, cung cấp các mã phím khác nhau.

PS: Tôi không lo lắng về hỗ trợ trình duyệt cũ, tôi đã thử tính năng này trong Chrome và đã rất ngạc nhiên và không thể tìm thấy lời giải thích.

+0

Câu hỏi [onKeyPress Vs. onKeyUp và onKeyDown] (http://stackoverflow.com/questions/3396754/onkeypress-vs-onkeyup-and-onkeydown) có phần liên quan và cũng có thể là đọc thú vị. –

Trả lời

42

Sự kiện này dành cho các mục đích hoàn toàn khác nhau. Sử dụng keyupkeydown để xác định các khóa vật lý và keypress để xác định các ký tự đã nhập. Cả hai là các nhiệm vụ cơ bản khác nhau với các sự kiện khác nhau; đừng cố trộn lẫn cả hai. Cụ thể, keyCode trên keypress sự kiện thường là không cần thiết và không được sử dụng (ngoại trừ trong IE cũ hơn, nhưng xem tài liệu được liên kết bên dưới để biết thêm về điều đó); cho các phím bấm có thể in, thường là giống như whichcharCode, mặc dù có một số biến thể giữa các trình duyệt.

Jan Wolter's article on key events, đã được liên kết trong câu trả lời khác, là từ dứt khoát về chủ đề này cho tôi và có bảng mô tả mỗi thuộc tính khác nhau trả về cho từng loại sự kiện chính và mỗi trình duyệt.

+5

Tôi hiểu rằng các mục đích khác nhau, nó không trả lời thực tế là mã khóa là khác nhau, mặc dù các * phím * giống nhau. –

+0

@ FlorianMargaine: Có các bảng trên trang của Jan Wolter cho biết mỗi tài sản trả về cho mỗi sự kiện.Đối với WebKit (và thực sự là hầu hết các trình duyệt hiện nay), 'keyCode' trả về giống như' which' và 'charCode' cho các sự kiện' keypress', là mã ký tự tương ứng với ký tự được gõ, trái ngược với mã khóa của khóa nhấn (vì nó nằm trong 'keyup' và' keydown'). –

+1

Tôi đã phải đọc kỹ bài viết cho phần này: 'Khi các sự kiện keydown và keyup, mã phím không phải là mã ký tự, và chuyển đổi này sẽ cho kết quả tự nhiên cho nhiều khóa. Không có cách di chuyển chung nào để chuyển đổi mã phím thành ký tự. Bạn khá nhiều phải cảm nhận được loại trình duyệt và căn cứ vào bản đồ chính trên đó. Tôi không có thông tin về mã phím được gửi bởi bàn phím quốc tế.' :) cảm ơn câu trả lời của bạn btw! –

2

Có một số good article on quirksmode.org trả lời chính xác câu hỏi đó. Bạn cũng có thể muốn xem Unixpapa's results.

+0

quirksmode đặc biệt nói: 'ví dụ, một chữ thường' a 'và chữ hoa' A 'có cùng mã khóa', đó là lý do tại sao tôi không hiểu. Có điều gì tôi đã bỏ lỡ? Bài viết thứ hai được liên kết trong câu hỏi liên quan :) –

+1

Chúng là cùng một khóa trên bàn phím của bạn, chỉ với các công cụ sửa đổi khác nhau (shift). Keyup/down là cho các tổ hợp phím, nhấn phím cho văn bản đã nhập. – Bergi

+0

Vì vậy, họ nên cung cấp cho cùng một mã phím. Tại sao họ không phụ thuộc vào sự kiện này? –

0

Vâng, tôi tình cờ gặp một sự khác biệt khi tôi đang cố gắng sao chép mục nhập của người dùng từ một đầu vào của biểu mẫu sang một số phần khác của biểu mẫu mà tôi đã khóa để người dùng chỉnh sửa. Những gì tôi thấy là, bất cứ khi nào người dùng chuyển sang nhãn tiếp theo bằng cách sử dụng phím khi hoàn thành đầu vào, một mục nhập bàn phím cuối cùng bị bỏ qua trong mục được sao chép khi tôi sử dụng eventListener để nhấn phím và điều này đã được giải quyết khi sử dụng khóa.

Vì vậy, trong kết luận bấm phím nghe bang tại ngay lập tức khi phím được nhấn, Gác lại những kết quả của phím nhấn, trong khi KeyUp lắng nghe tình trạng hệ thống sau khi chìa khóa đã được ép và bao gồm kết quả của phím bấm.

Các vấn đề liên quan