我有一个关于OnKeyDown事件的问题。 OnKeyDown事件提供了一个KeyCode,但我不确切知道给出了什么样的代码。基本上,我使用String.FromCharCode方法从我认为的ASCII代码中获取真实字符。它工作正常,直到我尝试使用来自小键盘的数字。如果我使用'w'上方的键输入'2'即可,但是使用来自小键盘的'2',KeyCode给出的是98(这是'b'Ascii代码)。
我正在看这个page并且存在同样的问题。该示例应该阻止用户键入数字。它与第一个字符顶部的数字完美匹配(缺少更好的名称),但您可以使用数字键盘输入数字。
你知道问题是什么吗? (这真的是ascii代码吗?我使用了错误的事件吗?)...
... THX
答案 0 :(得分:7)
要防止号码改为使用onkeypress
:
onkeypress="return PreventDigits(event);"
...
function PreventDigits(evt) {
evt = evt || window.event;
var keyCode = evt.keyCode || evt.which;7
var num = parseInt(String.fromCharCode(keyCode), 10);
return isNaN(num);
}
答案 1 :(得分:3)
从键码映射返回的数字到定义为here的以下集合。该集合与ASCII不对应,但在某些方面类似。我将看看是否可以找到有关如何从数字中获取字符的更多信息。
另外,我建议您使用e.which
代替e.keyCode
并且作为进一步的评论从不信任w3schools。
看看e.originalEvent.keyIdentifier
它似乎包含一些unicode。但它仍然将小键盘映射到A-H而不是0-9。我认为它只是讨厌小键盘。某处应该有一个布尔的isnumpad标志。 DOM3 API确实有一个布尔小键盘。
当您在小键盘上按1时,结果为e.originalEvent.keyLocation === 3
。
来自W3 spec
KeyboardEvent.DOM_KEY_LOCATION_STANDARD 常量KeyboardEvent.DOM_KEY_LOCATION_STANDARD的值为0x00。 KeyboardEvent.DOM_KEY_LOCATION_LEFT 常量KeyboardEvent.DOM_KEY_LOCATION_LEFT的值为0x01。 KeyboardEvent.DOM_KEY_LOCATION_RIGHT 常量KeyboardEvent.DOM_KEY_LOCATION_RIGHT的值为0x02。 KeyboardEvent.DOM_KEY_LOCATION_NUMPAD 常量KeyboardEvent.DOM_KEY_LOCATION_NUMPAD的值为0x03
所以keylocation === 3映射到DOM_KEY_LOCATION_NUMPAD然后你必须手动捕获numpad。你可以从小键盘的键码中减去48,将A-H映射到0-9
[大免责声明]
这就是FF& Chrome做的。上帝知道IE的作用,你可以自己征服那只野兽。我毫不怀疑它与W3规范完全不同。
答案 2 :(得分:3)
keyCode
和charCode
是不同的动物。 keyCode
与键盘和键loayout有关,而charCode
实际上给出了ascii字符代码。
此外,关键事件的不同实现还有很多不好之处。我一直很喜欢这个页面作为一个很好的来源:http://unixpapa.com/js/key.html
编辑:正如Raynos所说,在谷歌搜索出现时跳过w3schools。
答案 3 :(得分:0)
FF(至少v.10.0)没有Chrome所具有的事件属性“originalEvent.KeyLocation”。 如果你的文本字段应该是仅数字,你可以使用这段JS代码来识别小键盘数字。这也完全是跨浏览器:
var my_char=e.which;
if(e.which>95 && e.which<106){
my_char=(e.which-96).toString();
}