admin管理员组文章数量:1133968
Do the numbers on a numeric keypad have a different keycode than the numbers at the top of a keyboard?
Here is some JavaScript that is supposed to run on the keyup event, but only if the keycode is between 48 and 57. Here is the code:
$('#rollNum').keyup(function(e) {
if(e.keyCode >= 48 && e.keyCode <= 57) { //0-9 only
var max = 15;
var textLen = $(this).val().length;
var textLeft = max - textLen;
. . .
My problem is that this code only runs in response to the numbers entered at the top of the keyboard, but does not run in response to numbers entered from the numeric keypad.
I'm thinking the answer must be that the numeric keypad has different keyCode values, but how do I find out what those are?
Do the numbers on a numeric keypad have a different keycode than the numbers at the top of a keyboard?
Here is some JavaScript that is supposed to run on the keyup event, but only if the keycode is between 48 and 57. Here is the code:
$('#rollNum').keyup(function(e) {
if(e.keyCode >= 48 && e.keyCode <= 57) { //0-9 only
var max = 15;
var textLen = $(this).val().length;
var textLeft = max - textLen;
. . .
My problem is that this code only runs in response to the numbers entered at the top of the keyboard, but does not run in response to numbers entered from the numeric keypad.
I'm thinking the answer must be that the numeric keypad has different keyCode values, but how do I find out what those are?
Share Improve this question edited Dec 19, 2015 at 21:44 ROMANIA_engineer 56.5k30 gold badges208 silver badges205 bronze badges asked Nov 2, 2012 at 14:15 DanielAttardDanielAttard 3,5959 gold badges58 silver badges107 bronze badges 4 |14 Answers
Reset to default 185The keycodes are different. Keypad 0-9 is Keycode 96
to 105
Your if
statement should be:
if ((e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105)) {
// 0-9 only
}
Here's a reference guide for keycodes
-- UPDATE --
This is an old answer and keyCode
has been deprecated. There are now alternative methods to achieve this, such as using key
:
if ((e.key >= 48 && e.key <= 57) || (e.key >= 96 && e.key <= 105)) {
// 0-9 only
}
Here's an output tester for event.key, thanks to @Danziger for the link.
******************* Don't use KEYCODE !!!! ******************
The problem with keyCode is to avoid the combined keys with the numbers on top of keyboard, we must add a check on the key "Shift" and "Alt" to avoid special characters such as e @ & " { } ...
A simplest solution is to convert e.key to a number and check if the conversion gives NaN!
let key = Number(e.key)
if (isNaN(key) || e.key === null || e.key === ' ') {
console.log("is not numeric")
}
else {
console.log("is numeric")
}
Be careful if e.key is null or a space, it gives 0 !
Number(5) // => 5
Number('5') // => 5
Number(null) // => 0
Number(' ') // => 0
Number('chars') // => NaN
Number(undefined) // => NaN
You can simply run
$(document).keyup(function(e) {
console.log(e.keyCode);
});
to see the codes of pressed keys in the browser console.
Or you can find key codes here: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#Numpad_keys
keyCode is different for numbers on numeric keypad and numbers on top of keyboard.
keyCodes :
numbers on top of keyboard ( 0 - 9 ) : 48 - 57
numbers on numeric keypad ( 0 - 9 ) : 96 - 105
JavaScript condition :
if((e.keyCode >= 48 && e.keyCode <=57) || (e.keyCode >= 96 && e.keyCode <=105)) {
// entered key is a number
}
Reference for all keycodes ( with demo ) : http://www.codeforeach.com/javascript/keycode-for-each-key-and-usage-with-demo
For the people that want a CTRL+C, CTRL-V solution, here you go:
/**
* Retrieves the number that was pressed on the keyboard.
*
* @param {Event} event The keypress event containing the keyCode.
* @returns {number|null} a number between 0-9 that was pressed. Returns null if there was no numeric key pressed.
*/
function getNumberFromKeyEvent(event) {
if (event.keyCode >= 96 && event.keyCode <= 105) {
return event.keyCode - 96;
} else if (event.keyCode >= 48 && event.keyCode <= 57) {
return event.keyCode - 48;
}
return null;
}
It uses the logic of the first answer.
To add to some of the other answers, note that:
keyup
andkeydown
differ fromkeypress
- if you want to use
String.fromCharCode()
to get the actual digit fromkeyup
, you'll need to first normalize thekeyCode
.
Below is a self-documenting example that determines if the key is numeric, along with which number it is (example uses the range
function from lodash
).
const isKeypad = range(96, 106).includes(keyCode);
const normalizedKeyCode = isKeypad ? keyCode - 48 : keyCode;
const isDigit = range(48, 58).includes(normalizedKeyCode);
const digit = String.fromCharCode(normalizedKeyCode);
Yes, they are different and while many people have made a great suggestion of using console.log to see for yourself. However, I didn't see anyone mention event.location that you can use that to determine if the number is coming from the keypad event.location === 3
vs the top of the main keyboard / general keys event.location === 0
. This approach would be best suited for when you need to generally determine if keystrokes are coming from a region of the keyboard or not, event.key
is likely better for the specific keys.
You can use the key code page in order to find the:
event.code
to diference the number keyboard.
https://keycode.info/
function getNumberFromKeyEvent(event) {
if (event.code.indexOf('Numpad') === 0) {
var number = parseInt(event.code.replace('Numpad', ''), 10);
if (number >= 0 && number <= 9) {
// numbers from numeric keyboard
}
}
}
Docs says the order of events related to the onkeyxxx event:
- onkeydown
- onkeypress
- onkeyup
If you use like below code, it fits with also backspace and enter user interactions. After you can do what you want in onKeyPress or onKeyUp events. Code block trigger event.preventDefault function if the value is not number,backspace or enter.
onInputKeyDown = event => {
const { keyCode } = event;
if (
(keyCode >= 48 && keyCode <= 57) ||
(keyCode >= 96 && keyCode <= 105) ||
keyCode === 8 || //Backspace key
keyCode === 13 //Enter key
) {
} else {
event.preventDefault();
}
};
The answer by @.A. Morel I find to be the best easy to understand solution with a small footprint. Just wanted to add on top if you want a smaller code amount this solution which is a modification of Morel works well for not allowing letters of any sort including inputs notorious 'e' character.
function InputTypeNumberDissallowAllCharactersExceptNumeric() {
let key = Number(inputEvent.key);
return !isNaN(key);
}
Little bit cleared @A.Morel's answer. You might beware of keyboard language layout. Some keyboard layouts changed default numeric keys to symbols.
let key = parseInt(e.key)
if (isNaN(key)) {
console.log("is not numeric")
}
else {
console.log("is numeric")
}
You need to check event.key
converted to a number is between 0-9.
So we can create a range array 0-9 by Array.from(Array(10).keys())
and check the event.key
is in this range or not.
const isNumeric = Array.from(Array(10).keys()).includes(Number(event.key));
**event keyCode values for numeric keypad
function digitOnly(event) {
var key = event.keyCode;
if (event.key === '!' || event.key === '@' || event.key === '#'
|| event.key === '$' || event.key === '%'
|| event.key === '^' || event.key === '&'
|| event.key === '*' || event.key === '('
|| event.key === ')' || event.key === '_'
|| event.key === '-') {
return false;
}
if ((key >= 48 && key <= 57)
|| (key >= 96 && key <= 105 || key == 8)) {
return true;
} else {
return false;
}
};
<div id="phoneDiv">
<label for="phoneNumberId">Phone<b id="starText">*</b></label> <input
id="phoneNumberId" type="tel" name="phoneNumber"
placeholder="Enter Phone Number here" maxlength="10" minlength="10"
onkeydown="return digitOnly(event)" required>
</div>
**
You can use this to figure out keyCodes easily:
$(document).keyup(function(e) {
// Displays the keycode of the last pressed key in the body
$(document.body).html(e.keyCode);
});
http://jsfiddle.net/vecvc4fr/
本文标签: javascriptkeyCode values for numeric keypadStack Overflow
版权声明:本文标题:javascript - keyCode values for numeric keypad? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1736794300a1953222.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
e.keyCode
) are different forkeyup
andkeydown
because these events are related to the physical keys and those keys are different. If you usee.which
fromkeypress
, you'll get the same values for both keys. – ROMANIA_engineer Commented Dec 19, 2015 at 23:18