172 votes

Obtenir la valeur de caractère de code 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 l'e.mot de code ne peut pas être un caractère ASCII (alt backspace, del, des flèches, etc)... J'aurais maintenant besoin de "couper" ces valeurs à partir de la "valeur" d'une certaine manière (de préférence par programme - pas avec des tables de recherche)

Je suis à l'aide de jQuery.
Je dois utiliser l'événement "keydown". "keyPress" ne s'active pas de certaines touches je dois capturer (echap, suppr, retour arrière, etc...). Je ne peux pas utiliser setTimeout pour obtenir l'entrée de la valeur. (setTimeout(function(){},0) est trop lent.)

Je suis coincé. S'il vous plaît aider.

211voto

Adam Points 2623

Dans mon expérience de la Chaîne.fromCharCode(e.keyCode) n'est pas fiable. Chaîne de caractères.fromCharCode attend unicode charcodes comme argument; e.mot de code javascript renvoie les codes de touches. Javascript keycodes et unicode charcodes sont pas la même chose! En particulier, le pavé numérique touches de retourner un autre mot de code de l'ordinaire nombre de touches (puisqu'ils sont de différentes touches), tandis que le même mot de code est renvoyé à des fins à la fois des majuscules et des minuscules (vous avez appuyé sur la même touche dans les deux cas), malgré ses différents charcodes.

Par exemple, l'ordinaire de la touche de numéro 1 génère un événement avec mot de code 49 pendant clé pavé numérique 1 (avec la fonction de verrouillage numérique) génère keycode 97. Servir avec de la Ficelle.fromCharCode nous d'obtenir les éléments suivants:

  • Chaîne de caractères.fromCharCode(49) renvoie "1"
  • Chaîne de caractères.fromCharCode(97) renvoie "a"

Chaîne de caractères.fromCharCode attend unicode charcodes, pas de javascript codes de touche. La clé génère un événement avec un mot de code de 65 ans, independentant de l'affaire du personnage qu'elle génère (il y a aussi un modificateur pour si la touche maj est enfoncée, etc. dans le cas). Le caractère "a" a une unicode charcode de 61 tandis que le caractère "a" a Une charcode de 41 (selon, par exemple, http://www.utf8-chartable.de/). Cependant, ce sont les valeurs hexadécimales, la conversion en décimal nous donne un charcode de 65 ans pour "A" et 97 pour "une".[1] Ceci est cohérent avec ce que nous obtenons à partir de la Chaîne.fromCharCode pour ces valeurs.

Mon propre exigence a été limitée à la transformation des chiffres et des lettres ordinaires (acceptation ou de rejet en fonction de la position dans la chaîne) et de laisser les caractères de contrôle (touches F, ctrl-chose) à travers. Ainsi, je peux vérifier les caractères de contrôle, si ce n'est pas un caractère de contrôle-je vérifier à l'encontre d'une plage et c'est seulement alors que j'ai besoin d'obtenir le véritable caractère. Étant donné que je ne suis pas inquiet à propos de cas (j'ai changer toutes les lettres en majuscules, de toute façon) et ont déjà limité l'éventail des codes de touche, j'ai seulement à vous soucier de le pavé numérique touches. La suivante suffit:

String.fromCharCode((96 <= key && key <= 105)? key-48 : key)

Plus généralement, une fonction fiable retourne le caractère à partir d'un charcode serait génial (peut-être un plugin jQuery), mais je n'ai pas le temps d'écrire en ce moment. Désolé.

Je voudrais aussi mentionner l'e.(si vous utilisez jQuery) qui normalise e.mot de code et de l'e.charCode, de sorte que vous n'avez pas besoin de vous soucier de ce genre de touche a été pressée. Le problème avec le combinant avec de la Ficelle.fromCharCode reste.

[1] j'ai été perturbé pendant un certain temps -. tous les docs disent que Chaîne de caractères.fromCharCode s'attend à une unicode charcode, tandis que, dans la pratique, il a semblé fonctionner pour ASCII charcodes, mais qui était, je crois, en raison de la nécessité de convertir en décimal de l'hexagone, combiné avec le fait que l'ASCII charcodes et unicode décimal charcodes de chevauchement pour les lettres latines.

170voto

David Points 36241

Peut-être que je ne comprenais pas la question correctement, mais ne pouvez vous pas utiliser `` si vous voulez capturer les deux entrées ?

96voto

DaveAlger Points 317

Il y a relativement peu de key_codes donc je viens d'énumérer tous dans un tableau.

Tableau de key_names indexées par key_code:

// names of known key codes (0-255)
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",""];

Simple page à l'aide de la keyboardMap pour afficher les touches sont enregistrés lorsque vous tapez:

http://davealger.com/apps/keycodes/


Ci-dessous sont quelques-uns des principaux codes mérite d'être souligné.

Les Lettres De A-Z: (65-90)

keyboardMap[65];  // A
...
keyboardMap[90];  // Z

Chiffres de 0 à 9: (48-57)

keyboardMap[48];  // 0
...
keyboardMap[57];  // 9

Pavé Numérique 0-9: (96-105)

keyboardMap[96];   // NUMPAD0
...
keyboardMap[105];  // NUMPAD9

Touche Entrée: (13)

keyboardMap[13];   // ENTER

Touche Espace: (32)

keyboardMap[32];   // SPACE

Touches Fléchées: (37-40)

keyboardMap[37];   // LEFT
keyboardMap[38];   // UP
keyboardMap[39];   // RIGHT
keyboardMap[40];   // DOWN

2voto

Brian Peacock Points 327

En réponse à ce problème je viens d’écrire un plugin jQuery : https://github.com/bpeacock/key-to-charCode/

C’est un peu vers le bas et sale et puisse être mieux intégrée dans jQuery, mais c’est un début.

1voto

mjv Points 38081

Je suppose que c'est pour un jeu ou pour un rapide de répondre le type d'application, d'où l'utilisation de KEYDOWN de pression de TOUCHE.

Edit: Dang! Je suis corrigé (merci de Croissant Frais et David): JQuery (ou même plutôt le sous-jacent DOM hôtes) ne pas exposer le détail de la WM_KEYDOWN et d'autres événements. Plutôt, ils sont pré-digérer ces données et, dans le cas de keyDown même en JQuery, nous obtenons:

Notez que ces propriétés sont les valeurs UniCode.
Remarque, je n'étais pas en mesure de trouver un authorititative référence à JQuery dans docs, mais la plupart des exemples sur le net se référer à ces deux propriétés.

Le code suivant, adapté de certains java (pas de javascript) de la mine, est donc totalement faux...

Le tableau suivant vous donne les parties "intéressantes" du mot de 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X