이것이 내가 지금 가진 것입니다.
$("input").bind("keydown",function(e){
var value = this.value + String.fromCharCode(e.keyCode);
}
(가) 경우 e.keyCodeASCII 문자하지 않을 수 있습니다 ( 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자바 스크립트 키 코드를 반환합니다. 자바 스크립트 키 코드와 유니 코드 문자 코드는 동일 하지 않습니다 ! 특히, keycode숫자 키패드 키는 일반 숫자 키와 다르지만 (키가 다르기 때문에) 서로 다르지만 문자 와 keycode두 문자 모두에 대해 동일한 키 가 반환됩니다 (두 경우 모두 동일한 키를 누름) . upperlowercasecharcodes
예를 들어, 일반 숫자 키 1은 keycode49 로 이벤트를 생성하는 반면 숫자 키패드 키 1 ( Numlock켜짐)은 keycode97을 생성 String.fromCharCode합니다.
String.fromCharCode(49) returns "1"
String.fromCharCode(97) returns "a"
String.fromCharCode자바 스크립트 키 코드가 아닌 유니 코드 문자 코드가 필요합니다. 키 a는 생성하는 keycode문자의 경우에 관계없이 65 의 이벤트를 생성합니다 (이벤트 에서 Shift키를 누른 경우 등에 대한 수정 자도 있음 ). 문자 a는 유니 코드 charcode61이고 문자 A는 charcode41입니다 (예 : http://www.utf8-chartable.de/ ). 그러나이 hex값 은 10 진수로 변환하면 charcode“A”는 65이고 “a”는 97입니다. [1] 이것은 우리가 String.fromCharCode이러한 가치를 얻는 것과 일치 합니다.
내 자신의 요구 사항은 숫자와 일반 문자 (문자열의 위치에 따라 수락 또는 거부)를 처리하고 제어 문자 ( F-keys, Ctrl-something)를 통과 시키는 것으로 제한 되었습니다. 따라서 제어 문자가 아닌 경우 제어 문자를 확인할 수 있습니다. 제어 문자가 아닌 경우 범위를 확인한 다음 실제 문자를 가져와야합니다. 대소 문자에 대해 걱정하지 않고 (어쨌든 모든 문자를 대문자로 변경) 키 코드 범위를 이미 제한 했으므로 숫자 키패드 키만 걱정하면됩니다. 다음과 같이하면 충분합니다.
String.fromCharCode((96 <= key && key <= 105)? key-48 : key)
더 일반적으로 문자를 안정적으로 반환하는 함수 charcode는 훌륭하지만 (jQuery 플러그인과 같은 것), 지금은 쓸 시간이 없습니다. 죄송합니다.
또한 e.which정규화하는 e.keyCode및 ( jQuery를 사용하는 경우) 언급 하여 e.charCode어떤 종류의 키를 눌렀는지 걱정할 필요가 없습니다. 그것을 결합하는 문제는 String.fromCharCode남아 있습니다.
[1] 나는 잠시 혼란 스러웠다. 모든 문서 String.fromCharCode는 유니 코드 를 기대 한다고 말하지만 charcode실제로는 ASCII 문자 코드에서 작동하는 것처럼 보였지만 ASCII 문자 코드와 유니 코드 십진수 문자 코드가 평소와 겹친다는 사실과 함께 16 진수에서 10 진수로 변환해야한다고 생각했습니다. 라틴 문자.
답변
키 코드로 색인이 생성 된 읽을 수있는 키 이름
단순히 숫자를 변환 할 수 있도록 단순히 정적 배열의 모든 상응하는 값을 나열 그래서 상대적으로 적은 키 코드가 있습니다 65에 A사용이keyboardMap[65]
모든 키 코드가 인쇄 가능한 문자로 매핑되는 것은 아니므로 식별 가능한 다른 문자열이 반환됩니다.
필요에 맞게 배열을 수정해야 할 수도 있고 번역하지 않으려는 모든 문자에 대해 빈 문자열을 반환 할 수도 있습니다. 다음 배열을 사용하면 어떤 환경에서 어떤 키를 눌렀는지 빠르고 안정적으로 결정할 수 있습니다. 즐겨!
// 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]
];
참고 : 위 배열에서 각 값의 위치가 중요합니다. 은
""알 수없는 값을 코드에 대한 자리 표시 자입니다.
이 정적 배열 조회 접근 방식을 사용하여 다음 코드 스 니펫을 사용해보십시오 …
주목할 가치가있는 키 코드
편지 AZ : (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) 또는 Command 키 (Mac)
keyboardMap[91]; // OS_KEY
Alt 키 : (18)
keyboardMap[18]; // ALT
컨트롤 키 : (17)
keyboardMap[17]; // CONTROL
Shift 키 : (16)
keyboardMap[16]; // SHIFT
캡 잠금 키 : (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을 사용한다고 가정합니다.
편집 : Dang! 않는 JQuery와 (또는 오히려 기본 DOM 호스트) : 내가 수정 스탠드 (당신에게 초승달 신선한 다윗에게 감사) 하지 WM_KEYDOWN의 등 행사의 세부 사항을 노출합니다. 오히려 그들은이 데이터를 사전 소화하고 JQuery에서도 keyDown의 경우 다음을 얻습니다.
- 문자가 아닌 키를위한 event.keyCode
- 문자 키의 event.charCode
이러한 속성은 UniCode 값입니다.
참고로 JQuery 문서에서 권위있는 참조를 찾을 수는 없었지만 그물에 대한 많은 평판이 좋은 예제는이 두 속성을 나타냅니다.
따라서 내 자바 (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
답변
나는 이것이 오래된 질문이라는 것을 알고 있지만 오늘이 문제에 대한 사전 패키지 솔루션을 찾고 그것을 발견했으며 실제로 내 요구를 충족시키는 것을 찾지 못했습니다.
대문자 (shift), 소문자, 문장 부호, 숫자 키패드 등을 올바르게 지원하는 솔루션 (영어로만 제공)은 다음과 같습니다.
또한 ESC, 화살표, 기능 키 등과 같이 인쇄 할 수없는 키를 간단하고 간단하게 식별하고 반응 할 수 있습니다.
https://jsfiddle.net/5hhu896g/1/
keyboardCharMap and keyboardNameMap are the key to making this work
타이핑과 많은 발견을 구해준 DaveAlger에게 감사드립니다! -명명 된 키 배열을 제공합니다.
답변
최근 에 , 및 이벤트를 각각 문자와 키로 변환하는 keysight 라는 모듈을 작성했습니다 .keypresskeydownkeyup
예:
element.addEventListener("keydown", function(event) {
var character = keysight(event).char
})
