2010-11-16 24 views
11

Tôi cần phát hiện khóa đã được nhấn là phím có thể in, như ký tự, có thể có dấu, số, dấu cách, ký hiệu dấu câu, v.v ... hoặc phím không thể in, như ENTER, TAB hoặc DELETE.Phát hiện các phím có thể in

Có cách nào đáng tin cậy để làm điều này trong Javascript, ngoài việc liệt kê tất cả các phím không in được và hy vọng không quên một số?

Trả lời

15

Tôi đã trả lời similar question hôm qua. Lưu ý rằng bạn phải sử dụng sự kiện keypress để liên quan đến bất kỳ ký tự nào; keydown sẽ không hoạt động.

Tôi cho rằng Nhập có thể in được, nhân tiện, và chức năng này coi nó là. Nếu bạn không đồng ý, bạn có thể sửa đổi nó để lọc ra keypresses với which hoặc keyCode tài sản của sự kiện tập hợp để 13.

function isCharacterKeyPress(evt) { 
    if (typeof evt.which == "undefined") { 
     // This is IE, which only fires keypress events for printable keys 
     return true; 
    } else if (typeof evt.which == "number" && evt.which > 0) { 
     // In other browsers except old versions of WebKit, evt.which is 
     // only greater than zero if the keypress is a printable key. 
     // We need to filter out backspace and ctrl/alt/meta key combinations 
     return !evt.ctrlKey && !evt.metaKey && !evt.altKey && evt.which != 8; 
    } 
    return false; 
} 

var input = document.getElementById("your_input_id"); 
input.onkeypress = function(evt) { 
    evt = evt || window.event; 

    if (isCharacterKeyPress(evt)) { 
     // Do your stuff here 
     alert("Character!"); 
    } 
}); 
+0

MDN gợi ý rằng chúng tôi không nên sử dụng thuộc tính 'window.event' vì nó không chuẩn và có thể có sự không tương thích, [link] (https://developer.mozilla.org/en-US/docs/Web/ API/Cửa sổ/sự kiện). Có ý kiến ​​gì không? – Segmentation

+1

@ Phân cấp: Tôi hoàn toàn đồng ý. Tôi chỉ sử dụng nó cho khả năng tương thích với IE <= 8, đó là mối quan tâm nhiều hơn trong năm 2010 so với hiện tại. 'window.event' sẽ chỉ được sử dụng trong IE cũ trong câu trả lời này vì đối tượng sự kiện sẽ được chuyển vào trình xử lý sự kiện trong tất cả các trình duyệt hiện đại. –

15

May mắn thay, công việc này dễ dàng hơn nhiều trong các trình duyệt hiện đại. Bây giờ bạn có thể sử dụng KeyboardEvent.key để phát hiện khóa có thể in qua độ dài của nó.

test.onkeydown = e => { 
 
    let isPrintableKey = e.key.length === 1; 
 
    alert(`Key '${e.key}' is printable: ${isPrintableKey}`); 
 
}
<input id="test">

Bên cạnh đó, bạn cũng có thể phát hiện bất kỳ phím khác từ danh sách, như Enter, Delete, Backspace, Tab vv

Phương pháp này là đáng tin cậy hơn đơn giản chỉ vì không giống như event.which, event.key đã được chuẩn hóa.

+0

Cần lưu ý rằng điều này sẽ sụp đổ không đúng lúc trong các trình duyệt cũ hơn, vì 'e.key' không được xác định. Sẽ an toàn hơn để kiểm tra 'e.key && e.key.length === 1'. Ngay cả năm 2018, hỗ trợ toàn cầu cho 'khóa' chỉ ~ 80%: https://caniuse.com/#feat=keyboardevent-key – Thomas

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