2009-09-18 26 views
48

Tại sao người ta viết tuyên bố nhưkeycode và charCode

e.keyCode ? e.keyCode : e.charCode 

Một số người cũng sử dụng e.which

Ai đó có thể xin giải thích?

Trả lời

9

Đây là tuyên bố có điều kiện.

Nếu trình duyệt bổ sung e.keyCode thì hãy dùng e.keyCode else e.charCode.

Nó tương tự như

var code = event.keyCode || event.charCode 

event.keyCode: Trả về giá trị Unicode của một chìa khóa phi nhân vật trong một sự kiện bấm phím hoặc phím bất kỳ trong bất kỳ loại khác của sự kiện bàn phím.

event.charCode: Trả về giá trị Unicode của một phím ký tự được nhấn trong một sự kiện nhấn phím.

+9

Điều này có thể được viết dưới dạng một lớp lót : 'var keyCode = event.keyCode || event.charCode'. – davidchambers

4

mã khóa và đại diện cho phím bàn phím thực được nhấn ở dạng giá trị số. Lý do cả hai tồn tại là keyCode có sẵn trong Internet Explorer trong khi có sẵn trong các trình duyệt W3C như FireFox.

charCode tương tự, nhưng trong trường hợp này bạn lấy giá trị Unicode của ký tự được nhấn. Ví dụ: chữ "A."

Khái niệm JavaScript:

var keyCode = e.keyCode ? e.keyCode : e.charCode; 

Về cơ bản nói như sau:

Nếu tài sản e.keyCode tồn tại, thiết lập biến keyCode giá trị của nó. Nếu không, hãy đặt biến keyCode thành giá trị của thuộc tính e.charCode.

Lưu ý rằng việc truy xuất thuộc tính keyCode hoặc charCode thường liên quan đến việc tìm ra sự khác biệt giữa các mô hình sự kiện trong IE và W3C. Một số đòi hỏi những viết code như sau:

/* 
get the event object: either window.event for IE 
or the parameter e for other browsers 
*/ 
var evt = window.event ? window.event : e; 
/* 
get the numeric value of the key pressed: either 
event.keyCode for IE for e.which for other browsers 
*/ 
var keyCode = evt.keyCode ? evt.keyCode : e.which; 

EDIT: sửa lời giải thích của tôi về charCode theo ý kiến ​​Tor Haugen của.

+0

e.charCode là * không * văn bản. Nó trả về giá trị unicode (số) cho ký tự. Nó khác với keyCode ở chỗ nó sẽ có các giá trị khác nhau cho A và a, ví dụ (ví dụ, cho dù shift được giữ hay không). –

+0

@Tor: cảm ơn sự điều chỉnh. Tôi đã chỉnh sửa câu trả lời. –

93

Xử lý các sự kiện quan trọng một cách nhất quán không hề dễ dàng.

Thứ nhất, có hai loại mã khác nhau: mã bàn phím (số đại diện cho phím trên bàn phím mà người dùng đã nhấn) và mã ký tự (số đại diện cho ký tự Unicode). Bạn chỉ có thể nhận được mã số ký tự một cách đáng tin cậy trong sự kiện keypress. Đừng cố lấy mã ký tự cho các sự kiện keyupkeydown.

Thứ hai, bạn nhận được các tập hợp giá trị khác nhau trong sự kiện keypress cho sự kiện bạn nhận được trong sự kiện keyup hoặc keydown.

Tôi khuyên bạn nên this page làm tài nguyên hữu ích. Tóm tắt:

Nếu bạn quan tâm đến việc phát hiện người dùng nhập một ký tự, hãy sử dụng sự kiện keypress.IE bizarrely chỉ lưu trữ mã ký tự trong keyCode trong khi tất cả các trình duyệt khác lưu trữ nó trong which. Một số trình duyệt (nhưng không phải tất cả) cũng lưu trữ trong charCode và/hoặc keyCode. Một handler dụ nhấn phím:

function(evt) { 
    evt = evt || window.event; 
    var charCode = evt.which || evt.keyCode; 
    var charStr = String.fromCharCode(charCode); 
    alert(charStr); 
} 

Nếu bạn quan tâm trong việc phát hiện một chìa khóa không thể in được (chẳng hạn như một chìa khóa con trỏ), sử dụng các sự kiện keydown. Ở đây keyCode luôn là tài sản để sử dụng. Lưu ý rằng các sự kiện keyup có cùng thuộc tính.

function(evt) { 
    evt = evt || window.event; 
    var keyCode = evt.keyCode; 

    // Check for left arrow key 
    if (keyCode == 37) { 
    alert("Left arrow"); 
    } 
} 
+0

Cảm ơn, thông tin tốt đẹp: D –

+0

sir ... tại sao chúng ta sử dụng hoặc .... evt.which || evt.keyCode ... tại sao không chỉ e.which ... khi về cơ bản e.which trả về mã phím của phím được nhấn hoặc mã ký tự cho phím chữ và số được nhấn. –

+2

@bhavya_w: Để hỗ trợ các phiên bản cũ hơn của Internet Explorer (phiên bản 8 trở về trước), lưu trữ mã ký tự trong 'keyCode' và không hỗ trợ thuộc tính' which'. Xem http://unixpapa.com/js/key.html để biết nhiều chi tiết. –

-2

Thuộc tính event.which được thêm khi sử dụng jQuery để tránh sự khác biệt của trình duyệt. See docs.

Thuộc tính which sẽ không được xác định nếu bạn không sử dụng jQuery.

+3

'event.which' thực sự là một thuộc tính cũ từ những ngày của Netscape 4 và vẫn có sẵn (mặc dù không được chấp nhận) trong các trình duyệt hiện đại. jQuery đơn giản sử dụng cùng tên trong đối tượng sự kiện riêng của nó. – MrWhite

2

Được rồi, đây là những giải thích.

e.keyCode - được sử dụng để có được những con số đó đại diện cho phím trên bàn phím

e.charCode - một số đại diện các ký tự unicode của trên bàn phím

e .which - (jQuery cụ thể) là một thuộc tính được giới thiệu trong jQuery (KHÔNG sử dụng trong javascript đơn giản)

Dưới đây là đoạn mã để lấy mã khóa và mã số

<script> 
// get key code 
function getKey(event) { 
    event = event || window.event; 
    var keyCode = event.which || event.keyCode; 
    alert(keyCode); 
} 

// get char code 
function getChar(event) { 
    event = event || window.event; 
    var keyCode = event.which || event.keyCode; 
    var typedChar = String.fromCharCode(keyCode); 
    alert(typedChar); 
} 
</script> 

Ví dụ trực tiếp là Getting keyCode and charCode in JavaScript.

+0

Cuối cùng tôi đang nhận được giải thích đúng – NaveenDA

0

Tôi (là người bản thân mình) đã viết tuyên bố này vì tôi muốn phát hiện khóa mà người dùng đã gõ trên bàn phím trên các trình duyệt khác nhau.

Trong firefox chẳng hạn, các ký tự có> 0 mã khóa và 0 mã phím, và các phím như mũi tên & phím lùi có> 0 mã khóa và 0 mã vạch.

Tuy nhiên, việc sử dụng câu lệnh này có thể có vấn đề là "xung đột" là có thể. Ví dụ: Ví dụ: nếu bạn muốn phân biệt giữa các phím Delete và Period, điều này sẽ không hoạt động vì Delete có keyCode = 46 và Period có charCode = 46.

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