【问题标题】:Backslash key code is recognized as german umlaut反斜杠键码被识别为德语变音符号
【发布时间】:2016-12-16 21:06:20
【问题描述】:

我使用onkeydown 事件并从event 对象中读取按下的键:

function test(e) {
   e = e || window.e;
   var keyCode = e.which || e.keyCode;

   alert(keyCode +' -> '+ String.fromCharCode(keyCode));
}

如果用户按下反斜杠键 (\),上面的函数会很奇怪——它总是返回 Ü 而不是 \e.keyCode 的值是 220 这意味着一切正常,所以 fromCharCode() 可能是一个问题。 我认为问题在于反斜杠是一个特殊字符。但是如何省略它并为220 代码显示正确的字符?

我在JSFiddle上做了一个活生生的例子。

【问题讨论】:

  • 反斜杠的字符代码是92,而不是220。我也收到了 uml;aut 的报告,但我不知道为什么……('\\'.charCodeAt(0) === 92)。我非常怀疑问题出在fromCharCode 上,因为它太旧了,一定有人在某个时候注意到了。所以也许浏览器给了你错误的字符码。
  • 查看 Unicode 表,220 为 U(带两个点):utf8-chartable.de/unicode-utf8-table.pl?unicodeinhtml=dec
  • @Justinas,是的,但我也试过这个,当在键盘上按 `` 时,它也会报告我的 charcode 220。这是出乎意料的。

标签: javascript keycode


【解决方案1】:

这里的问题是您尝试将键盘键代码与键盘布局的实际字母匹配。

例如(test keyboard key code):

  1. 我的键盘布局是 zh-CN
  2. 我按2,键码是50
  3. 我将键盘布局(或键盘语言)更改为 lt-LT
  4. 我现在按同一个键,但现在应该输出č,但键码仍然是50

你应该有一些字母到键码的映射,但你永远不会匹配所有键盘布局。

function displayKeyCode(evt) {
  var textBox = getObject('txtChar');
  var charCode = (evt.which) ? evt.which : event.keyCode
  textBox.value = String.fromCharCode(charCode);
  if (charCode == 8) textBox.value = "backspace"; //  backspace
  if (charCode == 9) textBox.value = "tab"; //  tab
  if (charCode == 13) textBox.value = "enter"; //  enter
  if (charCode == 16) textBox.value = "shift"; //  shift
  if (charCode == 17) textBox.value = "ctrl"; //  ctrl
  if (charCode == 18) textBox.value = "alt"; //  alt
  if (charCode == 19) textBox.value = "pause/break"; //  pause/break
  if (charCode == 20) textBox.value = "caps lock"; //  caps lock
  if (charCode == 27) textBox.value = "escape"; //  escape
  if (charCode == 33) textBox.value = "page up"; // page up, to avoid displaying alternate character and confusing people	         
  if (charCode == 34) textBox.value = "page down"; // page down
  if (charCode == 35) textBox.value = "end"; // end
  if (charCode == 36) textBox.value = "home"; // home
  if (charCode == 37) textBox.value = "left arrow"; // left arrow
  if (charCode == 38) textBox.value = "up arrow"; // up arrow
  if (charCode == 39) textBox.value = "right arrow"; // right arrow
  if (charCode == 40) textBox.value = "down arrow"; // down arrow
  if (charCode == 45) textBox.value = "insert"; // insert
  if (charCode == 46) textBox.value = "delete"; // delete
  if (charCode == 91) textBox.value = "left window"; // left window
  if (charCode == 92) textBox.value = "right window"; // right window
  if (charCode == 93) textBox.value = "select key"; // select key
  if (charCode == 96) textBox.value = "numpad 0"; // numpad 0
  if (charCode == 97) textBox.value = "numpad 1"; // numpad 1
  if (charCode == 98) textBox.value = "numpad 2"; // numpad 2
  if (charCode == 99) textBox.value = "numpad 3"; // numpad 3
  if (charCode == 100) textBox.value = "numpad 4"; // numpad 4
  if (charCode == 101) textBox.value = "numpad 5"; // numpad 5
  if (charCode == 102) textBox.value = "numpad 6"; // numpad 6
  if (charCode == 103) textBox.value = "numpad 7"; // numpad 7
  if (charCode == 104) textBox.value = "numpad 8"; // numpad 8
  if (charCode == 105) textBox.value = "numpad 9"; // numpad 9
  if (charCode == 106) textBox.value = "multiply"; // multiply
  if (charCode == 107) textBox.value = "add"; // add
  if (charCode == 109) textBox.value = "subtract"; // subtract
  if (charCode == 110) textBox.value = "decimal point"; // decimal point
  if (charCode == 111) textBox.value = "divide"; // divide
  if (charCode == 112) textBox.value = "F1"; // F1
  if (charCode == 113) textBox.value = "F2"; // F2
  if (charCode == 114) textBox.value = "F3"; // F3
  if (charCode == 115) textBox.value = "F4"; // F4
  if (charCode == 116) textBox.value = "F5"; // F5
  if (charCode == 117) textBox.value = "F6"; // F6
  if (charCode == 118) textBox.value = "F7"; // F7
  if (charCode == 119) textBox.value = "F8"; // F8
  if (charCode == 120) textBox.value = "F9"; // F9
  if (charCode == 121) textBox.value = "F10"; // F10
  if (charCode == 122) textBox.value = "F11"; // F11
  if (charCode == 123) textBox.value = "F12"; // F12
  if (charCode == 144) textBox.value = "num lock"; // num lock
  if (charCode == 145) textBox.value = "scroll lock"; // scroll lock
  if (charCode == 186) textBox.value = ";"; // semi-colon
  if (charCode == 187) textBox.value = "="; // equal-sign
  if (charCode == 188) textBox.value = ","; // comma
  if (charCode == 189) textBox.value = "-"; // dash
  if (charCode == 190) textBox.value = "."; // period
  if (charCode == 191) textBox.value = "/"; // forward slash
  if (charCode == 192) textBox.value = "`"; // grave accent
  if (charCode == 219) textBox.value = "["; // open bracket
  if (charCode == 220) textBox.value = "\\"; // back slash
  if (charCode == 221) textBox.value = "]"; // close bracket
  if (charCode == 222) textBox.value = "'"; // single quote
  var lblCharCode = getObject('spnCode');
  lblCharCode.innerHTML = 'KeyCode:  ' + charCode;
  return false;
}

function getObject(obj) {
  var theObj;
  if (document.all) {
    if (typeof obj == 'string') {
      return document.all(obj);
    } else {
      return obj.style;
    }
  }
  if (document.getElementById) {
    if (typeof obj == 'string') {
      return document.getElementById(obj);
    } else {
      return obj.style;
    }
  }
  return null;
}
<input onkeypress="javascript:return false;" id="txtChar" onkeydown="javascript:return displayKeyCode(event)" name="txtChar" type="text"/><br/>
<span id="spnCode"></span>

【讨论】:

  • 我不确定我是否理解正确:您提供的代码和站点 - 都显示代码 220 用于在我的键盘上按下反斜杠。对于测试,我已将键盘布局更改为 en-US - 反斜杠仍然返回代码 220。更重要的是:我默认使用 pl-PL 语言,我们的语言没有变音符号。我检查了关键代码表 (foreui.com/articles/Key_Code_Table.htm) 和 `\` 有 220 值:|
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2023-03-08
  • 2019-11-18
  • 1970-01-01
  • 2013-02-09
相关资源
最近更新 更多