Obtenir la valeur de caractère de KeyCode en JavaScript... puis couper
c'est Ce que j'ai maintenant:
$("input").bind("keydown",function(e){
var value = this.value + String.fromCharCode(e.keyCode);
}
Si le e.keyCode
peut-être pas un caractère ASCII ( Alt , backspace , del , flèches , etc.)...
J'aurais maintenant besoin de trim
ces valeurs de value
d'une façon ou d'une autre (de préférence par programmation - pas avec des tables de recherche).
j'utilise jQuery.
je dois utiliser l'événement keydown
. keyPress
ne s'active pas de certaines touches je dois capturer ( Esc , del , backspace , etc.).
Je ne peux pas utiliser setTimeout
pour obtenir la valeur de l'entrée. setTimeout(function(){},0)
est trop lent.
9 réponses
peut-être que je n'ai pas compris la question correctement, mais pouvez-vous ne pas utiliser keyup
si vous voulez capturer les deux entrées?
$("input").bind("keyup",function(e){
var value = this.value + String.fromCharCode(e.keyCode);
});
d'après mon expérience, String.fromCharCode(e.keyCode)
n'est pas fiable. String.fromCharCode
attend des charcodes unicode comme argument; e.keyCode
renvoie des keycodes javascript. Les clés Javascript et les charcodes unicode sont et non la même chose! En particulier, les touches numberpad renvoient un keycode
différent des touches du numéro ordinaire (puisqu'il s'agit de touches différentes) alors que le même keycode
est retourné pour les deux lettres upper
et lowercase
(vous avez appuyé sur le même 151990920".
par exemple, la touche de chiffre ordinaire 1 génère un événement avec keycode
49 tandis que la touche de chiffre 1 (avec Numlock on) génère keycode
97. Utilisé avec String.fromCharCode
nous obtenons le suivant:
String.fromCharCode(49) returns "1"
String.fromCharCode(97) returns "a"
String.fromCharCode
attend des charcodes unicode, pas des keycodes javascript. La touche un génère un événement avec un keycode
de 65, indépendant du cas du caractère qu'il générerait (il y a aussi un modificateur pour si la touche Shift est pressée, etc. dans le cas). Le caractère a a un unicode charcode
de 61 tandis que le caractère A a un charcode
de 41 (selon, par exemple, http://www.utf8-chartable.de / ). Cependant, ce sont des valeurs hex
, converties en décimales il nous donne un charcode
de 65 pour" A "et 97 pour"a".[1] Ceci est cohérent avec ce que nous obtenons de String.fromCharCode
pour ces valeurs.
ma propre exigence se limitait au traitement de chiffres et de lettres ordinaires (acceptation ou rejet selon la position dans la chaîne) et à la mise en place de caractères de contrôle ( F - touches, Ctrl - quelque chose). Ainsi, je peux vérifier les caractères de contrôle, si ce n'est pas un contrôle caractère je vérifie par rapport à une gamme et seulement alors je dois obtenir le caractère réel. Etant donné que je ne m'inquiète pas de case (je change toutes les lettres en majuscules de toute façon) et que j'ai déjà limité la gamme de keycodes, Je n'ai qu'à m'inquiéter des touches numberpad. Il suffit pour cela:
String.fromCharCode((96 <= key && key <= 105)? key-48 : key)
plus généralement, une fonction pour retourner de manière fiable le caractère d'un charcode
serait génial (peut-être comme un plugin jQuery), mais je n'ai pas le temps de l'écrire tout à l'heure. Désolé.
je mentionnerais aussi e.which
(si vous utilisez jQuery) qui normalise e.keyCode
et e.charCode
, de sorte que vous n'avez pas besoin de vous soucier de quel type de clé a été pressé. Le problème de la combinaison avec String.fromCharCode
reste.
[1] j'ai été confus pendant un certain temps. tous les docs disent que String.fromCharCode
attend un unicode charcode
, alors que dans la pratique, il semblait fonctionner pour les charcodes ASCII, mais c'était je pense dû à la nécessité de convertir à la décimale de hex, combiné avec le fait que les charcodes ASCII et les charcodes décimaux unicode se chevauchent pour les lettres latines ordinaires.
noms de clés lisibles indexés par code de clé
il y a relativement peu de codes clés donc j'ai simplement énuméré toutes les valeurs correspondantes dans un tableau statique donc je pourrais simplement convertir le nombre 65
en A
en utilisant keyboardMap[65]
tous les codes clés ne correspondent pas à un caractère imprimable de sorte qu'une autre chaîne identifiable est retournée.
vous pouvez avoir besoin de modifier le tableau pour convenir vos besoins et peut simplement retourner des chaînes vides pour tous les caractères que vous ne vous souciez pas de traduire. Le tableau suivant me permet de déterminer rapidement et de façon fiable quelle touche a été pressée dans n'importe quel environnement. Profitez-en!
// names of known key codes (0-255)
var keyboardMap = [
"", // [0]
"", // [1]
"", // [2]
"CANCEL", // [3]
"", // [4]
"", // [5]
"HELP", // [6]
"", // [7]
"BACK_SPACE", // [8]
"TAB", // [9]
"", // [10]
"", // [11]
"CLEAR", // [12]
"ENTER", // [13]
"ENTER_SPECIAL", // [14]
"", // [15]
"SHIFT", // [16]
"CONTROL", // [17]
"ALT", // [18]
"PAUSE", // [19]
"CAPS_LOCK", // [20]
"KANA", // [21]
"EISU", // [22]
"JUNJA", // [23]
"FINAL", // [24]
"HANJA", // [25]
"", // [26]
"ESCAPE", // [27]
"CONVERT", // [28]
"NONCONVERT", // [29]
"ACCEPT", // [30]
"MODECHANGE", // [31]
"SPACE", // [32]
"PAGE_UP", // [33]
"PAGE_DOWN", // [34]
"END", // [35]
"HOME", // [36]
"LEFT", // [37]
"UP", // [38]
"RIGHT", // [39]
"DOWN", // [40]
"SELECT", // [41]
"PRINT", // [42]
"EXECUTE", // [43]
"PRINTSCREEN", // [44]
"INSERT", // [45]
"DELETE", // [46]
"", // [47]
"0", // [48]
"1", // [49]
"2", // [50]
"3", // [51]
"4", // [52]
"5", // [53]
"6", // [54]
"7", // [55]
"8", // [56]
"9", // [57]
"COLON", // [58]
"SEMICOLON", // [59]
"LESS_THAN", // [60]
"EQUALS", // [61]
"GREATER_THAN", // [62]
"QUESTION_MARK", // [63]
"AT", // [64]
"A", // [65]
"B", // [66]
"C", // [67]
"D", // [68]
"E", // [69]
"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]
"OS_KEY", // [91] Windows Key (Windows) or Command Key (Mac)
"", // [92]
"CONTEXT_MENU", // [93]
"", // [94]
"SLEEP", // [95]
"NUMPAD0", // [96]
"NUMPAD1", // [97]
"NUMPAD2", // [98]
"NUMPAD3", // [99]
"NUMPAD4", // [100]
"NUMPAD5", // [101]
"NUMPAD6", // [102]
"NUMPAD7", // [103]
"NUMPAD8", // [104]
"NUMPAD9", // [105]
"MULTIPLY", // [106]
"ADD", // [107]
"SEPARATOR", // [108]
"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]
"F13", // [124]
"F14", // [125]
"F15", // [126]
"F16", // [127]
"F17", // [128]
"F18", // [129]
"F19", // [130]
"F20", // [131]
"F21", // [132]
"F22", // [133]
"F23", // [134]
"F24", // [135]
"", // [136]
"", // [137]
"", // [138]
"", // [139]
"", // [140]
"", // [141]
"", // [142]
"", // [143]
"NUM_LOCK", // [144]
"SCROLL_LOCK", // [145]
"WIN_OEM_FJ_JISHO", // [146]
"WIN_OEM_FJ_MASSHOU", // [147]
"WIN_OEM_FJ_TOUROKU", // [148]
"WIN_OEM_FJ_LOYA", // [149]
"WIN_OEM_FJ_ROYA", // [150]
"", // [151]
"", // [152]
"", // [153]
"", // [154]
"", // [155]
"", // [156]
"", // [157]
"", // [158]
"", // [159]
"CIRCUMFLEX", // [160]
"EXCLAMATION", // [161]
"DOUBLE_QUOTE", // [162]
"HASH", // [163]
"DOLLAR", // [164]
"PERCENT", // [165]
"AMPERSAND", // [166]
"UNDERSCORE", // [167]
"OPEN_PAREN", // [168]
"CLOSE_PAREN", // [169]
"ASTERISK", // [170]
"PLUS", // [171]
"PIPE", // [172]
"HYPHEN_MINUS", // [173]
"OPEN_CURLY_BRACKET", // [174]
"CLOSE_CURLY_BRACKET", // [175]
"TILDE", // [176]
"", // [177]
"", // [178]
"", // [179]
"", // [180]
"VOLUME_MUTE", // [181]
"VOLUME_DOWN", // [182]
"VOLUME_UP", // [183]
"", // [184]
"", // [185]
"SEMICOLON", // [186]
"EQUALS", // [187]
"COMMA", // [188]
"MINUS", // [189]
"PERIOD", // [190]
"SLASH", // [191]
"BACK_QUOTE", // [192]
"", // [193]
"", // [194]
"", // [195]
"", // [196]
"", // [197]
"", // [198]
"", // [199]
"", // [200]
"", // [201]
"", // [202]
"", // [203]
"", // [204]
"", // [205]
"", // [206]
"", // [207]
"", // [208]
"", // [209]
"", // [210]
"", // [211]
"", // [212]
"", // [213]
"", // [214]
"", // [215]
"", // [216]
"", // [217]
"", // [218]
"OPEN_BRACKET", // [219]
"BACK_SLASH", // [220]
"CLOSE_BRACKET", // [221]
"QUOTE", // [222]
"", // [223]
"META", // [224]
"ALTGR", // [225]
"", // [226]
"WIN_ICO_HELP", // [227]
"WIN_ICO_00", // [228]
"", // [229]
"WIN_ICO_CLEAR", // [230]
"", // [231]
"", // [232]
"WIN_OEM_RESET", // [233]
"WIN_OEM_JUMP", // [234]
"WIN_OEM_PA1", // [235]
"WIN_OEM_PA2", // [236]
"WIN_OEM_PA3", // [237]
"WIN_OEM_WSCTRL", // [238]
"WIN_OEM_CUSEL", // [239]
"WIN_OEM_ATTN", // [240]
"WIN_OEM_FINISH", // [241]
"WIN_OEM_COPY", // [242]
"WIN_OEM_AUTO", // [243]
"WIN_OEM_ENLW", // [244]
"WIN_OEM_BACKTAB", // [245]
"ATTN", // [246]
"CRSEL", // [247]
"EXSEL", // [248]
"EREOF", // [249]
"PLAY", // [250]
"ZOOM", // [251]
"", // [252]
"PA1", // [253]
"WIN_OEM_CLEAR", // [254]
"" // [255]
];
Note: la position de chaque valeur dans le tableau ci-dessus est importante. les
""
sont des espaces réservés pour les codes dont les valeurs sont inconnues.
essayez l'extrait de code suivant en utilisant cette approche de recherche de tableau statique...
var keyCodes = [];
$("#reset").click(function() {
keyCodes = [];
$("#in").val("");
$("#key-codes").html("var keyCodes = [ ];");
$("#key-names").html("var keyNames = [ ];");
});
$(document).keydown(function(e) {
keyCodes.push(e.which);
updateOutput();
});
function updateOutput() {
var kC = "var keyCodes = [ ";
var kN = "var keyNames = [ ";
var len = keyCodes.length;
for (var i = 0; i < len; i++) {
kC += keyCodes[i];
kN += "'"+keyboardMap[keyCodes[i]]+"'";
if (i !== (len - 1)) {
kC += ", ";
kN += ", ";
}
}
kC += " ];";
kN += " ];";
$("#key-codes").html(kC);
$("#key-names").html(kN);
}
var keyboardMap = [
"", // [0]
"", // [1]
"", // [2]
"CANCEL", // [3]
"", // [4]
"", // [5]
"HELP", // [6]
"", // [7]
"BACK_SPACE", // [8]
"TAB", // [9]
"", // [10]
"", // [11]
"CLEAR", // [12]
"ENTER", // [13]
"ENTER_SPECIAL", // [14]
"", // [15]
"SHIFT", // [16]
"CONTROL", // [17]
"ALT", // [18]
"PAUSE", // [19]
"CAPS_LOCK", // [20]
"KANA", // [21]
"EISU", // [22]
"JUNJA", // [23]
"FINAL", // [24]
"HANJA", // [25]
"", // [26]
"ESCAPE", // [27]
"CONVERT", // [28]
"NONCONVERT", // [29]
"ACCEPT", // [30]
"MODECHANGE", // [31]
"SPACE", // [32]
"PAGE_UP", // [33]
"PAGE_DOWN", // [34]
"END", // [35]
"HOME", // [36]
"LEFT", // [37]
"UP", // [38]
"RIGHT", // [39]
"DOWN", // [40]
"SELECT", // [41]
"PRINT", // [42]
"EXECUTE", // [43]
"PRINTSCREEN", // [44]
"INSERT", // [45]
"DELETE", // [46]
"", // [47]
"0", // [48]
"1", // [49]
"2", // [50]
"3", // [51]
"4", // [52]
"5", // [53]
"6", // [54]
"7", // [55]
"8", // [56]
"9", // [57]
"COLON", // [58]
"SEMICOLON", // [59]
"LESS_THAN", // [60]
"EQUALS", // [61]
"GREATER_THAN", // [62]
"QUESTION_MARK", // [63]
"AT", // [64]
"A", // [65]
"B", // [66]
"C", // [67]
"D", // [68]
"E", // [69]
"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]
"OS_KEY", // [91] Windows Key (Windows) or Command Key (Mac)
"", // [92]
"CONTEXT_MENU", // [93]
"", // [94]
"SLEEP", // [95]
"NUMPAD0", // [96]
"NUMPAD1", // [97]
"NUMPAD2", // [98]
"NUMPAD3", // [99]
"NUMPAD4", // [100]
"NUMPAD5", // [101]
"NUMPAD6", // [102]
"NUMPAD7", // [103]
"NUMPAD8", // [104]
"NUMPAD9", // [105]
"MULTIPLY", // [106]
"ADD", // [107]
"SEPARATOR", // [108]
"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]
"F13", // [124]
"F14", // [125]
"F15", // [126]
"F16", // [127]
"F17", // [128]
"F18", // [129]
"F19", // [130]
"F20", // [131]
"F21", // [132]
"F22", // [133]
"F23", // [134]
"F24", // [135]
"", // [136]
"", // [137]
"", // [138]
"", // [139]
"", // [140]
"", // [141]
"", // [142]
"", // [143]
"NUM_LOCK", // [144]
"SCROLL_LOCK", // [145]
"WIN_OEM_FJ_JISHO", // [146]
"WIN_OEM_FJ_MASSHOU", // [147]
"WIN_OEM_FJ_TOUROKU", // [148]
"WIN_OEM_FJ_LOYA", // [149]
"WIN_OEM_FJ_ROYA", // [150]
"", // [151]
"", // [152]
"", // [153]
"", // [154]
"", // [155]
"", // [156]
"", // [157]
"", // [158]
"", // [159]
"CIRCUMFLEX", // [160]
"EXCLAMATION", // [161]
"DOUBLE_QUOTE", // [162]
"HASH", // [163]
"DOLLAR", // [164]
"PERCENT", // [165]
"AMPERSAND", // [166]
"UNDERSCORE", // [167]
"OPEN_PAREN", // [168]
"CLOSE_PAREN", // [169]
"ASTERISK", // [170]
"PLUS", // [171]
"PIPE", // [172]
"HYPHEN_MINUS", // [173]
"OPEN_CURLY_BRACKET", // [174]
"CLOSE_CURLY_BRACKET", // [175]
"TILDE", // [176]
"", // [177]
"", // [178]
"", // [179]
"", // [180]
"VOLUME_MUTE", // [181]
"VOLUME_DOWN", // [182]
"VOLUME_UP", // [183]
"", // [184]
"", // [185]
"SEMICOLON", // [186]
"EQUALS", // [187]
"COMMA", // [188]
"MINUS", // [189]
"PERIOD", // [190]
"SLASH", // [191]
"BACK_QUOTE", // [192]
"", // [193]
"", // [194]
"", // [195]
"", // [196]
"", // [197]
"", // [198]
"", // [199]
"", // [200]
"", // [201]
"", // [202]
"", // [203]
"", // [204]
"", // [205]
"", // [206]
"", // [207]
"", // [208]
"", // [209]
"", // [210]
"", // [211]
"", // [212]
"", // [213]
"", // [214]
"", // [215]
"", // [216]
"", // [217]
"", // [218]
"OPEN_BRACKET", // [219]
"BACK_SLASH", // [220]
"CLOSE_BRACKET", // [221]
"QUOTE", // [222]
"", // [223]
"META", // [224]
"ALTGR", // [225]
"", // [226]
"WIN_ICO_HELP", // [227]
"WIN_ICO_00", // [228]
"", // [229]
"WIN_ICO_CLEAR", // [230]
"", // [231]
"", // [232]
"WIN_OEM_RESET", // [233]
"WIN_OEM_JUMP", // [234]
"WIN_OEM_PA1", // [235]
"WIN_OEM_PA2", // [236]
"WIN_OEM_PA3", // [237]
"WIN_OEM_WSCTRL", // [238]
"WIN_OEM_CUSEL", // [239]
"WIN_OEM_ATTN", // [240]
"WIN_OEM_FINISH", // [241]
"WIN_OEM_COPY", // [242]
"WIN_OEM_AUTO", // [243]
"WIN_OEM_ENLW", // [244]
"WIN_OEM_BACKTAB", // [245]
"ATTN", // [246]
"CRSEL", // [247]
"EXSEL", // [248]
"EREOF", // [249]
"PLAY", // [250]
"ZOOM", // [251]
"", // [252]
"PA1", // [253]
"WIN_OEM_CLEAR", // [254]
"" // [255]
];
#key-codes,
#key-names {
font-family: courier, serif;
font-size: 1.2em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input id="in" placeholder="Type here..." />
<button id="reset">Reset</button>
<br/>
<br/>
<div id="key-codes">var keyCodes = [ ];</div>
<div id="key-names">var keyNames = [ ];</div>
codes de Clé intéressant de noter
Lettres A-Z: (65-90)
keyboardMap[65]; // A
...
keyboardMap[90]; // Z
chiffres 0-9: (48-57)
keyboardMap[48]; // 0
...
keyboardMap[57]; // 9
Pavé Numérique 0-9: (96-105)
keyboardMap[96]; // NUMPAD0
...
keyboardMap[105]; // NUMPAD9
Flèches: (37-40)
keyboardMap[37]; // LEFT
keyboardMap[38]; // UP
keyboardMap[39]; // RIGHT
keyboardMap[40]; // DOWN
Touche De Tabulation: (9)
keyboardMap[9]; // TAB
Entrer La Clé: (13)
keyboardMap[13]; // ENTER
Clé Spacebar: (32)
keyboardMap[32]; // SPACE
clé spécifique OS (91) clé Windows (Windows) ou clé de commande (Mac)
keyboardMap[91]; // OS_KEY
Touche Alt: (18)
keyboardMap[18]; // ALT
Clé De Contrôle: (17)
keyboardMap[17]; // CONTROL
Touche Shift: (16)
keyboardMap[16]; // SHIFT
Serrure Caps: (20)
keyboardMap[20]; // CAPS_LOCK
juste une remarque importante: la réponse acceptée ci-dessus ne fonctionnera pas correctement pour le keyCode >= 144, c.-à-d. période, virgule, tiret, etc. Pour ceux que vous devriez utiliser un algorithme plus général:
let chrCode = keyCode - 48 * Math.floor(keyCode / 48);
let chr = String.fromCharCode((96 <= keyCode) ? chrCode: keyCode);
si vous êtes curieux de savoir pourquoi, cela est apparemment nécessaire en raison du comportement de la fonction JS intégrée String.fromCharCode()
. Pour les valeurs de keyCode <= 96
il semble cartographier en utilisant la fonction:
chrCode = keyCode - 48 * Math.floor(keyCode / 48)
pour valeurs de keyCode > 96
il semble cartographier en utilisant la fonction:
chrCode = keyCode
Si cela semble étrange comportement..Je suis d'accord. Malheureusement, ce serait très loin de la chose la plus étrange que j'ai vu dans le noyau JS.
document.onkeydown = function(e) {
let keyCode = e.keyCode;
let chrCode = keyCode - 48 * Math.floor(keyCode / 48);
let chr = String.fromCharCode((96 <= keyCode) ? chrCode: keyCode);
console.log(chr);
};
<input type="text" placeholder="Focus and Type"/>
je suppose que c'est pour un jeu ou pour un type d'application à réponse rapide d'où L'utilisation de KEYDOWN que KEYPRESS.
Modifier : Dang! Je suis corrigé (Merci Crescent Fresh et David): JQuery (ou même plutôt les hôtes DOM sous-jacents) ne pas exposer le détail du WM_KEYDOWN et d'autres événements. Ils pré-digèrent plutôt ces données et, dans le cas de keyDown même dans JQuery, nous obtenons:
- événement.code de saisie pour les clés sans caractère
- de l'événement.charCode pour les touches de caractères
notez que ces propriétés sont les valeurs UniCode.
Note, je n'ai pas pu trouver de référence autoritaire à cela dans JQuery docs, mais de nombreux exemples réputés sur le net font référence à ces deux propriétés.
le code, adapté d'un de mes java (pas javascript), est donc totalement erroné...
ce qui suit vous donnera les parties "intéressantes" du code:
value = e.KeyCode;
repeatCount = value & 0xFF;
scanCode = (value >> 16) & 0xFF; // note we take the "extended bit" deal w/ it later.
wasDown = ((value & 0x4000) != 0); // indicate key was readily down (auto-repeat)
if (scanCode > 127)
// deal with extended
else
// "regular" character
en réponse à ce problème, je viens d'écrire un plugin jQuery: https://github.com/bpeacock/key-to-charCode/
c'est un peu bas et sale et pourrait être mieux intégré dans jQuery, mais c'est un début.
je sais que c'est une vieille question, mais je suis tombé sur elle aujourd'hui à la recherche d'une solution préemballée à ce problème, et n'a trouvé rien qui répond vraiment à mes besoins.
Voici une solution (en anglais seulement) qui prend en charge correctement les majuscules (décalé), les minuscules, ponctuation, pavé numérique, etc.
il permet également l'identification simple et directe de-et la réaction à - clés non imprimables, comme ESC, flèches, touches de fonction, etc.
https://jsfiddle.net/5hhu896g/1 /
keyboardCharMap and keyboardNameMap are the key to making this work
merci à DaveAlger de m'avoir épargné un peu de Dactylographie - et beaucoup de découverte! - en fournissant le tableau de clés nommé.
voir ce lien Obtenir le Keycode de la touche et le char de la valeur d'une clé de code
$('input#inp').keyup(function(e){
$(this).val(String.fromCharCode(e.keyCode));
$('div#output').html('Keycode : ' + e.keyCode);
});