问题
How can I handle ArrowKeys and <
(Greater Than) in a Javascript function? Which event and which code (charCode Or keyCode)?
I am very confused how to do this. I have read this link very carefully, Events and keyCode+charCode, but I could not find any solution for my scenario.
回答1:
Using event.keyCode
is sufficient. You only need to browser compatibility issues with regard to obtaining the key event into account.
Here's a basic kickoff example which captures arrow keys, copy'n'paste'n'run it:
<!DOCTYPE html>
<html lang="en">
<head>
<title>SO question 3181648</title>
<script>
document.onkeydown = function(e) {
e = e || event; // "real browsers" || IE6/7.
switch (e.keyCode) {
case 37: alert('left'); break;
case 38: alert('up'); break;
case 39: alert('right'); break;
case 40: alert('down'); break;
}
}
</script>
</head>
<body>
<p>Press one of the arrow keys.</p>
</body>
</html>
Note that attaching events is better to be done this way or using jQuery.
For capturing the pressed characters like <
, have a look at Tim's answer.
回答2:
When detecting a non-text-input key such as an arrow key, using the keydown
event is the correct approach. For detecting a typed character such as <
, using the keypress
event is the only safe approach. If you instead use the keydown
event and its keyCode
property, this is not guaranteed to work on types of keyboard and browsers different to your own.
If you really want to learn about JavaScript key handling, I recommend the following page: http://unixpapa.com/js/key.html
Here's an example for your requirements:
document.onkeydown = function(evt) {
evt = evt || window.event;
switch (evt.keyCode) {
case 37: alert("left"); break;
case 38: alert("up"); break;
case 39: alert("right"); break;
case 40: alert("down"); break;
}
};
document.onkeypress = function(evt) {
evt = evt || window.event;
var charCode = evt.which || evt.keyCode;
var charStr = String.fromCharCode(charCode);
if (charStr == "<") {
alert("<");
}
};
回答3:
<script type="text/javascript">
var Keys = {
BACKSPACE: 8, TAB: 9, ENTER: 13, SHIFT: 16,
CTRL: 17, ALT: 18, PAUSE: 19, CAPS: 20,
ESC: 27, PAGEUP: 33, PAGEDN: 34, END: 35,
HOME: 36, LEFT: 37, UP: 38, RIGHT: 39,
DOWN: 40, INSERT: 45, DELETE: 46,
n0: 48, n1: 49, n2: 50, n3: 51, n4: 52,
n5: 53, n6: 54, n7: 55, n8: 56, n9: 57,
A:65, B:66, C:67, D:68, E:68, F:70, G:71, H:72, I:73, J:74, K:75,
L:76, M:77, N:78, O:79, P:80, Q:81, R:82, S:83, T:84, U:85, V:86,
W:87, X:88, Y:89, Z:90,
WINLEFT: 91, WINRIGHT: 92, SELECT: 93, NUM0: 96,
NUM1: 97, NUM2: 98, NUM3: 99, NUM4: 100,
NUM5: 101, NUM6: 102, NUM7: 103, NUM8: 104,
NUM9: 105, MULTIPLY: 106, ADD: 107, SUBTRACT: 109,
DECIMAL: 110, DIVIDE: 111, F1: 112, F2: 113,
F3: 114, F4: 115, F5: 116, F6: 117,
F7: 118, F8: 119, F9: 120, F10: 121,
F11: 122, F12: 123, NUMLOCK: 144, SCROLLLOCK: 145,
SEMICOLON: 186,EQUAL: 187, COMMA: 188, DASH: 189,
PERIOD: 190, FORWARDSLASH: 191, GRAVEACCENT: 192,
OPENBRACKET: 219, BACKSLASH: 220,
CLOSEBRACKET: 221, QUOTE: 222
};
/* true - will be handled also by default handler and for false - will not (if you wanna disable some keys) */
function pressedKeyHandler(key){
if (k != Keys.COMMA || k != Keys.DASH) return true;
//handle pressed button here
return true;
}
if (typeof window.event != 'undefined') // IE
document.onkeydown = function() { return pressedKeyHandler(event.keyCode); }
else // FireFox/Opera/Others
document.onkeypress = function(e) { return pressedKeyHandler(e.keyCode); }
</script>
I may be wrong but seems that for IE better to handle onkeydown event rather then onkeypress.
来源:https://stackoverflow.com/questions/3181648/how-can-i-handle-arrowkeys-and-greater-than-in-a-javascript-function-which