これは私が今持っているものです:
$("input").bind("keydown",function(e){
var value = this.value + String.fromCharCode(e.keyCode);
}
e.keyCode
がASCII文字でない場合(Alt、 backspace、 del、 arrowsなど)...ここで、これらの値をtrim
からvalue
にする必要があります(ルックアップテーブルではなく、プログラムで行うことが望ましい)。
JQueryを使用しています。
keydown
イベントを使用する必要があります。 keyPress
は、キャプチャする必要がある特定のキーに対してアクティブになりません(Esc、 del、 backspaceなど)。
setTimeout
を使用して入力値を取得することはできません。 setTimeout(function(){},0)
が遅すぎます。
質問を正しく理解できなかったのかもしれませんが、両方の入力をキャプチャしたい場合はkeyup
を使用できませんか?
$("input").bind("keyup",function(e){
var value = this.value + String.fromCharCode(e.keyCode);
});
私の経験では、String.fromCharCode(e.keyCode)
は信頼できません。 String.fromCharCode
は、ユニコード文字コードを引数として期待します。 e.keyCode
はJavaScriptキーコードを返します。 JavascriptキーコードとUnicode文字コードはnot同じものではありません!特に、数字パッドキーは通常の数字キーとは異なるkeycode
を返します(異なるキーであるため)が、keycode
とupper
の両方の文字に対して同じlowercase
が返されます(両方のケースで同じcharcodes
を押したにもかかわらず) 。
たとえば、通常の数字キー1はkeycode
49のイベントを生成し、数字パッドキー1は( Numlock on)keycode
97を生成します。String.fromCharCode
とともに使用すると、次のようになります。
String.fromCharCode(49) returns "1"
String.fromCharCode(97) returns "a"
String.fromCharCode
は、javascriptキーコードではなく、ユニコード文字コードを想定しています。キー a 生成する文字の大文字小文字に関係なく、keycode
が65のイベントを生成します(もし、 Shift イベントでキーが押されるなど)。キャラクター a ユニコードのcharcode
は61で、文字は A charcode
は41です(たとえば、 http://www.utf8-chartable.de/ による)。ただし、これらはhex
値であり、10進数に変換すると、「A」では65、「a」では97のcharcode
が得られます。[1]これは、これらの値に対してString.fromCharCode
から得られるものと一致しています。
私自身の要件は、数字と通常の文字の処理(文字列内の位置に応じて受け入れまたは拒否)と制御文字(F-キー、 Ctrl-何か)を通して。したがって、範囲に対してチェックする制御文字でない場合、実際の文字を取得する必要がある場合にのみ、制御文字を確認できます。私は大文字小文字を心配せず(すべての文字を大文字に変更します)、キーコードの範囲を既に制限しているので、テンキーのキーについてだけ心配する必要があります。次のことで十分です。
String.fromCharCode((96 <= key && key <= 105)? key-48 : key)
より一般的には、charcode
から確実に文字を返す関数は(おそらくjQueryプラグインとして)素晴らしいと思いますが、今すぐ書く時間はありません。ごめんなさい。
また、e.which
とe.keyCode
を正規化するe.charCode
(jQueryを使用している場合)に言及するので、どのようなキーが押されたかを心配する必要はありません。 String.fromCharCode
と組み合わせた場合の問題は残ります。
[1]しばらく混乱していた-。すべてのドキュメントは、String.fromCharCode
がユニコードcharcode
を期待していると言っていますが、実際にはASCII charcodesで動作するように見えましたが、それはASCII文字コードとUnicode 10進文字コードは、通常のラテン文字で重複しています。
キーコードが比較的少ないので、静的配列にすべての対応する値をリストしただけなので、65
を使用して番号keyboardMap[65]
をA
に変換できます。
すべてのキーコードが印刷可能な文字にマップされるわけではないため、他の識別可能な文字列が返されます。
ニーズに合わせて配列を変更する必要がある場合があり、変換する必要のないすべての文字に対して空の文字列を返すだけで済みます。次の配列を使用すると、どの環境でもどのキーが押されたかを迅速かつ確実に判断できます。楽しい!
// 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]
];
注:上の配列内の各値の位置は重要です。
""
は、値が不明なコードのプレースホルダーです。
この静的配列検索アプローチを使用して、次のコードスニペットを試してください...
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>
レターA-Z:(65-90)
keyboardMap[65]; // A
...
keyboardMap[90]; // Z
桁0-9:(48-57)
keyboardMap[48]; // 0
...
keyboardMap[57]; // 9
数字パッド0-9:(96-105)
keyboardMap[96]; // NUMPAD0
...
keyboardMap[105]; // NUMPAD9
矢印キー:(37-40)
keyboardMap[37]; // LEFT
keyboardMap[38]; // UP
keyboardMap[39]; // RIGHT
keyboardMap[40]; // DOWN
タブキー:(9)
keyboardMap[9]; // TAB
キーを入力:(13)
keyboardMap[13]; // ENTER
スペースバーキー:(32)
keyboardMap[32]; // SPACE
OS固有のキー(91)Windowsキー(Windows)またはコマンドキー(Mac)
keyboardMap[91]; // OS_KEY
Altキー:(18)
keyboardMap[18]; // ALT
コントロールキー:(17)
keyboardMap[17]; // CONTROL
Shiftキー:(16)
keyboardMap[16]; // SHIFT
Caps Lockキー:(20)
keyboardMap[20]; // CAPS_LOCK
重要な注意:上記の受け入れられた答えは、keyCode> = 144、つまりピリオド、コンマ、ダッシュなどでは正しく機能しません。これらの場合、より一般的なアルゴリズムを使用する必要があります。
let chrCode = keyCode - 48 * Math.floor(keyCode / 48);
let chr = String.fromCharCode((96 <= keyCode) ? chrCode: keyCode);
理由が知りたければ、組み込みのJS関数String.fromCharCode()
の動作のために、これが明らかに必要です。 keyCode <= 96
の値については、関数を使用してマップするようです:
chrCode = keyCode - 48 * Math.floor(keyCode / 48)
keyCode > 96
の値については、関数を使用してマップするようです:
chrCode = keyCode
これが奇妙な振る舞いのように思えるなら、それで..私は同意します。悲しいことに、それは私が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"/>
これはゲーム用または高速応答タイプのアプリケーション用であるため、KEYPRESSよりもKEYDOWNを使用することを想定しています。
編集:ダン!私は修正しました(Crescent FreshとDavidに感謝します):JQuery(またはむしろ基礎となるDOMホスト)は、WM_KEYDOWNおよびその他のイベントの詳細を公開しませんnot。むしろ、彼らはこのデータを事前に消化し、JQueryでさえkeyDownの場合、以下を取得します。
これらのプロパティはUniCode値であることに注意してください。
注:JQueryドキュメントでは信頼できる参照を見つけることができませんでしたが、ネット上の評判の良い例の多くはこれら2つのプロパティを参照しています。
したがって、私のJava(javascriptではありません)を一部修正した次のコードは完全に間違っています...
以下は、キーコードの「興味深い」部分を示します。
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
キーコードの実際のUnicode文字値を探してここに来た人のために、私がしたように、ここにそのための関数があります。たとえば、右矢印のユニコードキーコードを指定すると、表示される文字列\u001B\u005B\u0043
が出力されます
function toUnicode(theString) {
var unicodeString = '';
for (var i = 0; i < theString.length; i++) {
var theUnicode = theString.charCodeAt(i).toString(16).toUpperCase();
while (theUnicode.length < 4) {
theUnicode = '0' + theUnicode;
}
theUnicode = '\\u' + theUnicode;
unicodeString += theUnicode;
}
return unicodeString;
}
最近、keypress
、keydown
、およびkeyup
イベントをそれぞれ文字とキーに変換する keysight というモジュールを作成しました。
例:
element.addEventListener("keydown", function(event) {
var character = keysight(event).char
})
これは古い質問であることは知っていますが、今日、この問題に対する事前にパッケージ化された解決策を探してそれに出くわしましたが、本当に私のニーズを満たすものは見つかりませんでした。
以下は、大文字(シフト)、小文字、句読点、数字キーパッドなどを正しくサポートするソリューション(英語のみ)です。
また、ESC、矢印、ファンクションキーなどの非印刷可能キーのシンプルでわかりやすい識別および対応が可能です。
https://jsfiddle.net/5hhu896g/1/
keyboardCharMap and keyboardNameMap are the key to making this work
入力の手間を省いてくれたDaveAlgerに感謝します。 -名前付きキー配列を提供する。