2010-07-26 4 views
4

나는 String.fromCharCode()이라는 행운을 찾았습니다. 그것은 크게 도움이되었습니다. 그러나, 나는 그것이 교대 변경자를 고려하지 않는다는 것을 알아 차렸다. 나는 event.shiftKey 속성을 알고 그것을 사용하지만, 지금은 Shift 키 수정자를 고려한 키 값 (예 : "A"또는 "a")을 가져와야합니다. 처음에는 String.toLowerCase()을 사용했습니다. 그러나 숫자 키를 생각하지 않고 "5"(시프트 없음) 및 "%"(시프트 포함) 한 예를 들었습니다. 내 프로그램에서이 둘을 구별해야합니다. 키 값을 얻는 가장 쉬운 방법은 무엇입니까?시프트 수정 자로 키 코드에서 키 char (값) 가져 오기

+0

더 성능이 좋은입니다보다 완벽한 솔루션입니다. keypress, keyup, keydown 이벤트 중에 ShiftKey가 눌 렸는지 확인하려고합니까? 아니면 문자의 문자열을 평가하고 그것을 대문자 또는 숫자/특수 문자인지 알고 싶습니까? –

+0

키 이벤트 중에 Shift 키가 눌러 졌는지 확인하는 방법을 알고 있습니다. 내가 묻는 것은 키를 눌렀을 때의 문자를 얻는 방법이 있다면 (시프트 키를 고려한 방법) – Alan

+0

당신이 원하는 것이 분명하지 않다. 타이핑 된 실제 캐릭터를 원하십니까? 누를 실제 물리적 키? –

답변

6

이 무차별 기술은 가장 좋지 않지만 작동하는 것처럼 보입니다. 나는 동일한 기능을 찾고있다.

function mapKeyPressToActualCharacter(isShiftKey, characterCode) { 
    if (characterCode === 27 || characterCode === 8 || characterCode === 9 || characterCode === 20 || characterCode === 16 || characterCode === 17 || characterCode === 91 || characterCode === 13 || characterCode === 92 || characterCode === 18) { 
     return false; 
    } 
    if (typeof isShiftKey != "boolean" || typeof characterCode != "number") { 
     return false; 
    } 
    var characterMap = []; 
    characterMap[192] = "~"; 
    characterMap[49] = "!"; 
    characterMap[50] = "@"; 
    characterMap[51] = "#"; 
    characterMap[52] = "$"; 
    characterMap[53] = "%"; 
    characterMap[54] = "^"; 
    characterMap[55] = "&"; 
    characterMap[56] = "*"; 
    characterMap[57] = "("; 
    characterMap[48] = ")"; 
    characterMap[109] = "_"; 
    characterMap[107] = "+"; 
    characterMap[219] = "{"; 
    characterMap[221] = "}"; 
    characterMap[220] = "|"; 
    characterMap[59] = ":"; 
    characterMap[222] = "\""; 
    characterMap[188] = "<"; 
    characterMap[190] = ">"; 
    characterMap[191] = "?"; 
    characterMap[32] = " "; 
    var character = ""; 
    if (isShiftKey) { 
     if (characterCode >= 65 && characterCode <= 90) { 
      character = String.fromCharCode(characterCode); 
     } else { 
      character = characterMap[characterCode]; 
     } 
    } else { 
     if (characterCode >= 65 && characterCode <= 90) { 
      character = String.fromCharCode(characterCode).toLowerCase(); 
     } else { 
      character = String.fromCharCode(characterCode); 
     } 
    } 
    return character; 
} 
+0

예. 좋아 보인다. brute force 메서드를 시도하기 전에 허용 된 솔루션이 있는지 알아야했습니다. 응답 해 주셔서 감사합니다. – Alan

+0

이 방법이 효과적이지만 실제로 표준화 된 해결책이 없다는 사실에 화를 냈습니다. –

+0

미국 이외 지역의 키보드 레이아웃을 위해이 계정을 만드는 방법에 대해 생각해보십시오 (예 : 영국 키보드의 'Shift + 3'은 파운드 기호)? –

3

모든 것은 바인딩 할 이벤트에 따라 다릅니다. String.fromCharCode()onkeypress 이벤트 중에 shiftKey에 해당합니다. 그러나 onkeydown 이벤트 중에는주의를 기울이지 않습니다.

1

는 wsams 응답에 확장, 여기에 더 많은 메모리가 필요하지만 질문의 내용이 무엇인지

var characterMapShift = []; 
characterMapShift[8] = ""; 
characterMapShift[9] = ""; 
characterMapShift[13] = "\n"; 
characterMapShift[16] = ""; 
characterMapShift[17] = ""; 
characterMapShift[18] = ""; 
characterMapShift[19] = ""; 
characterMapShift[20] = ""; 
characterMapShift[27] = ""; 
characterMapShift[32] = " "; 
characterMapShift[33] = ""; 
characterMapShift[34] = ""; 
characterMapShift[35] = ""; 
characterMapShift[36] = ""; 
characterMapShift[37] = ""; 
characterMapShift[38] = ""; 
characterMapShift[39] = ""; 
characterMapShift[40] = ""; 
characterMapShift[45] = ""; 
characterMapShift[46] = ""; 
characterMapShift[48] = ")"; 
characterMapShift[49] = "!"; 
characterMapShift[50] = "@"; 
characterMapShift[51] = "#"; 
characterMapShift[52] = "$"; 
characterMapShift[53] = "%"; 
characterMapShift[54] = "^"; 
characterMapShift[55] = "&"; 
characterMapShift[56] = "*"; 
characterMapShift[57] = "("; 
characterMapShift[59] = ":"; 
characterMapShift[61] = "+"; 
characterMapShift[65] = "A"; 
characterMapShift[66] = "B"; 
characterMapShift[67] = "C"; 
characterMapShift[68] = "D"; 
characterMapShift[69] = "E"; 
characterMapShift[70] = "F"; 
characterMapShift[71] = "G"; 
characterMapShift[72] = "H"; 
characterMapShift[73] = "I"; 
characterMapShift[74] = "J"; 
characterMapShift[75] = "K"; 
characterMapShift[76] = "L"; 
characterMapShift[77] = "M"; 
characterMapShift[78] = "N"; 
characterMapShift[79] = "O"; 
characterMapShift[80] = "P"; 
characterMapShift[81] = "Q"; 
characterMapShift[82] = "R"; 
characterMapShift[83] = "S"; 
characterMapShift[84] = "T"; 
characterMapShift[85] = "U"; 
characterMapShift[86] = "V"; 
characterMapShift[87] = "W"; 
characterMapShift[88] = "X"; 
characterMapShift[89] = "Y"; 
characterMapShift[90] = "Z"; 
characterMapShift[91] = ""; 
characterMapShift[92] = ""; 
characterMapShift[93] = ""; 
characterMapShift[96] = "0"; 
characterMapShift[97] = "1"; 
characterMapShift[98] = "2"; 
characterMapShift[99] = "3"; 
characterMapShift[100] = "4"; 
characterMapShift[101] = "5"; 
characterMapShift[102] = "6"; 
characterMapShift[103] = "7"; 
characterMapShift[104] = "8"; 
characterMapShift[105] = "9"; 
characterMapShift[106] = "*"; 
characterMapShift[107] = "+"; 
characterMapShift[109] = "_"; 
characterMapShift[107] = "+"; 
characterMapShift[111] = "/"; 
characterMapShift[112] = ""; 
characterMapShift[113] = ""; 
characterMapShift[114] = ""; 
characterMapShift[115] = ""; 
characterMapShift[116] = ""; 
characterMapShift[117] = ""; 
characterMapShift[118] = ""; 
characterMapShift[119] = ""; 
characterMapShift[120] = ""; 
characterMapShift[121] = ""; 
characterMapShift[122] = ""; 
characterMapShift[123] = ""; 
characterMapShift[144] = ""; 
characterMapShift[145] = ""; 
characterMapShift[186] = ":"; 
characterMapShift[187] = "+"; 
characterMapShift[188] = "<"; 
characterMapShift[189] = "_"; 
characterMapShift[190] = ">"; 
characterMapShift[191] = "?"; 
characterMapShift[192] = "~"; 
characterMapShift[219] = "{"; 
characterMapShift[220] = "|"; 
characterMapShift[221] = "}"; 
characterMapShift[222] = "\""; 

var characterMap = []; 
characterMap[8] = ""; 
characterMap[9] = ""; 
characterMap[13] = "\n"; 
characterMap[16] = ""; 
characterMap[17] = ""; 
characterMap[18] = ""; 
characterMap[19] = ""; 
characterMap[20] = ""; 
characterMap[27] = ""; 
characterMap[32] = " "; 
characterMap[33] = ""; 
characterMap[34] = ""; 
characterMap[35] = ""; 
characterMap[36] = ""; 
characterMap[37] = ""; 
characterMap[38] = ""; 
characterMap[39] = ""; 
characterMap[40] = ""; 
characterMap[45] = ""; 
characterMap[46] = ""; 
characterMap[48] = "0"; 
characterMap[49] = "1"; 
characterMap[50] = "2"; 
characterMap[51] = "3"; 
characterMap[52] = "4"; 
characterMap[53] = "5"; 
characterMap[54] = "6"; 
characterMap[55] = "7"; 
characterMap[56] = "8"; 
characterMap[57] = "9"; 
characterMap[59] = ";"; 
characterMap[61] = "="; 
characterMap[65] = "a"; 
characterMap[66] = "b"; 
characterMap[67] = "c"; 
characterMap[68] = "d"; 
characterMap[69] = "e"; 
characterMap[70] = "f"; 
characterMap[71] = "g"; 
characterMap[72] = "h"; 
characterMap[73] = "i"; 
characterMap[74] = "j"; 
characterMap[75] = "k"; 
characterMap[76] = "l"; 
characterMap[77] = "m"; 
characterMap[78] = "n"; 
characterMap[79] = "o"; 
characterMap[80] = "p"; 
characterMap[81] = "q"; 
characterMap[82] = "r"; 
characterMap[83] = "s"; 
characterMap[84] = "t"; 
characterMap[85] = "u"; 
characterMap[86] = "v"; 
characterMap[87] = "w"; 
characterMap[88] = "x"; 
characterMap[89] = "y"; 
characterMap[90] = "z"; 
characterMap[91] = ""; 
characterMap[92] = ""; 
characterMap[93] = ""; 
characterMap[96] = "0"; 
characterMap[97] = "1"; 
characterMap[98] = "2"; 
characterMap[99] = "3"; 
characterMap[100] = "4"; 
characterMap[101] = "5"; 
characterMap[102] = "6"; 
characterMap[103] = "7"; 
characterMap[104] = "8"; 
characterMap[105] = "9"; 
characterMap[106] = "*"; 
characterMap[107] = "+"; 
characterMap[109] = "_"; 
characterMap[107] = "+"; 
characterMap[111] = "/"; 
characterMap[112] = ""; 
characterMap[113] = ""; 
characterMap[114] = ""; 
characterMap[115] = ""; 
characterMap[116] = ""; 
characterMap[117] = ""; 
characterMap[118] = ""; 
characterMap[119] = ""; 
characterMap[120] = ""; 
characterMap[121] = ""; 
characterMap[122] = ""; 
characterMap[123] = ""; 
characterMap[144] = ""; 
characterMap[145] = ""; 
characterMap[186] = ";"; 
characterMap[187] = "="; 
characterMap[188] = ","; 
characterMap[189] = "-"; 
characterMap[190] = "."; 
characterMap[191] = "/"; 
characterMap[192] = "`"; 
characterMap[219] = "["; 
characterMap[220] = "\\"; 
characterMap[221] = "]"; 
characterMap[222] = "'"; 

function mapKeyPressToActualCharacter(isShiftKey, characterCode) { 
    if (typeof isShiftKey != "boolean" || typeof characterCode != "number") { 
     return false; 
    } 

    if (isShiftKey) { 
     return characterMapShift[characterCode]; 
    } else { 
     return characterMap[characterCode]; 
    } 
}