如何从Android手机键盘获取按键代码?

8

目前,我在移动设备上遇到了一个问题。 我有一个输入字段,只允许按下某些键:例如仅数字0-9。 在Web浏览器中它的效果非常好。 但是当我在Android移动设备上打开它时,它会失败。

我使用了keyupkeypresskeyup正常工作,但我想知道哪个键从移动键盘触发了事件。 我该如何做到这一点?


你可以使用 event.keyCode 或 event.key 来获取按键信息。试试这个: document.onkeyup = function(e){ console.log(e); } - Dipen Shah
1
@Jugnu,我已经尝试过这种类型的代码了。首先,当你写入keyCode或charCode时,它只会给出229 0的结果。那么你怎么知道当前按下了哪个键呢? - Arya
你可能找不到键,但你可以通过将该键值作为keycode放置在给定索引上的keyboardmap数组中映射该keycode,就像我所做的那样。 - Juned Lanja
@Amy 我认为几乎所有的浏览器都支持在keypress事件中返回按键码.. 你能否提供你正在测试的浏览器细节以及你编写的用于测试的代码? - Kushal
1
@Kushal 是的,所有的浏览器都会在按键按下时提供keycode,但在安卓手机的chrome浏览器上不会。只有在桌面上才会提供。 - Arya
显示剩余6条评论
2个回答

4
我正在使用一个数组,其中包含映射到给定索引处的所有键盘键的键码,然后在元素的keydown事件中检查它是否为允许的键,因为在移动设备上,某些键盘键将具有与数字键的键码相同的代码,因此它将允许这些键。
因此,我使用以下内容来防止这种情况发生。
//keyboard maping array   
var keyboardMap = ["", "", "", "CANCEL", "", "", "HELP", "", "BACK_SPACE", "TAB", "", "", "CLEAR", "ENTER", "RETURN", "", "SHIFT", "CONTROL", "ALT", "PAUSE", "CAPS_LOCK", "KANA", "EISU", "JUNJA", "FINAL", "HANJA", "", "ESCAPE", "CONVERT", "NONCONVERT", "ACCEPT", "MODECHANGE", "SPACE", "PAGE_UP", "PAGE_DOWN", "END", "HOME", "LEFT", "UP", "RIGHT", "DOWN", "SELECT", "PRINT", "EXECUTE", "PRINTSCREEN", "INSERT", "DELETE", "", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "COLON", "SEMICOLON", "LESS_THAN", "EQUALS", "GREATER_THAN", "QUESTION_MARK", "AT", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "WIN", "", "CONTEXT_MENU", "", "SLEEP", "NUMPAD0", "NUMPAD1", "NUMPAD2", "NUMPAD3", "NUMPAD4", "NUMPAD5", "NUMPAD6", "NUMPAD7", "NUMPAD8", "NUMPAD9", "MULTIPLY", "ADD", "SEPARATOR", "SUBTRACT", "DECIMAL", "DIVIDE", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "F13", "F14", "F15", "F16", "F17", "F18", "F19", "F20", "F21", "F22", "F23", "F24", "", "", "", "", "", "", "", "", "NUM_LOCK", "SCROLL_LOCK", "WIN_OEM_FJ_JISHO", "WIN_OEM_FJ_MASSHOU", "WIN_OEM_FJ_TOUROKU", "WIN_OEM_FJ_LOYA", "WIN_OEM_FJ_ROYA", "", "", "", "", "", "", "", "", "", "CIRCUMFLEX", "EXCLAMATION", "DOUBLE_QUOTE", "HASH", "DOLLAR", "PERCENT", "AMPERSAND", "UNDERSCORE", "OPEN_PAREN", "CLOSE_PAREN", "ASTERISK", "PLUS", "PIPE", "HYPHEN_MINUS", "OPEN_CURLY_BRACKET", "CLOSE_CURLY_BRACKET", "TILDE", "", "", "", "", "VOLUME_MUTE", "VOLUME_DOWN", "VOLUME_UP", "", "", "", "", "COMMA", "", "PERIOD", "SLASH", "BACK_QUOTE", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "OPEN_BRACKET", "BACK_SLASH", "CLOSE_BRACKET", "QUOTE", "", "META", "ALTGR", "", "WIN_ICO_HELP", "WIN_ICO_00", "", "WIN_ICO_CLEAR", "", "", "WIN_OEM_RESET", "WIN_OEM_JUMP", "WIN_OEM_PA1", "WIN_OEM_PA2", "WIN_OEM_PA3", "WIN_OEM_WSCTRL", "WIN_OEM_CUSEL", "WIN_OEM_ATTN", "WIN_OEM_FINISH", "WIN_OEM_COPY", "WIN_OEM_AUTO", "WIN_OEM_ENLW", "WIN_OEM_BACKTAB", "ATTN", "CRSEL", "EXSEL", "EREOF", "PLAY", "ZOOM", "", "PA1", "WIN_OEM_CLEAR", ""];
//Allowed keys as per your requirement          
var allowedKey = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "NUMPAD0", "NUMPAD1", "NUMPAD2", "NUMPAD3", "NUMPAD4", "NUMPAD5", "NUMPAD6", "NUMPAD7", "NUMPAD8", "NUMPAD9", "DELETE", "BACK_SPACE", "DECIMAL", "LEFT", "RIGHT", "TAB", "SUBTRACT", "PERIOD"];

//bind keydown to your element
element.on("keydown", function (e) {
        var key = e.charCode || e.keyCode || 0;
        var keyValue = keyboardMap[key];
        if ($.inArray(keyValue, allowedKey) !== -1){
              return true;
        }
        else{
              return  false;
        }
}

对我来说它有效,希望对您也有效。


你好,你能否帮忙看一下这个问题:https://dev59.com/PUkFtIcB2Jgan1zn_Vuk 我在移动设备上遇到了无法检测 keyCode 的问题。谢谢! - cbdeveloper
在某些安卓设备上,keyCodewhich的值总是为229 - Hackinet
请在发布答案之前在相应的设备上进行测试。要么您没有测试,要么自那以后行为发生了变化。正如@Hackinet之前所述,它始终返回229,因此您无法识别键。 - BalB

0
var input_field = document.getElementById('chatBot-input');
input_field.addEventListener('textInput', function (ev) {
  var char = ev.data; // In our example = "a"
  var keyCode = char.charCodeAt(0); // a = 97
  console.log(keyCode)
});

这肯定会起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接