OnKeyDown and String.FromCharCode

4
我有一个关于OnKeyDown事件的问题。 OnKeyDown事件会提供一个KeyCode,但我不知道它是什么类型的代码。基本上,我一直在使用String.FromCharCode方法从我认为是ASCII码的内容中获取真正的字符。这个方法在我使用字母键盘上的数字时很好用,但当我使用小键盘上的数字时就出现了问题。如果我使用位于w上方的键入2,那么没问题,但是使用小键盘上的2时,给出的KeyCode是98(即b的ASCII码)。
我看了一下这个页面,发现同样的问题。示例旨在防止用户输入数字。对于第一个字符上面的数字来说,这个示例完全有效,但是你可以使用小键盘输入数字。
你有任何想法吗?(这是否真的是ASCII码?我是否使用了错误的事件?)...

感谢所有的回答,但是我正在使用一个由编辑器提供的组件,只提供OnKeyDown...我很困扰。我不知道w3school很糟糕... - LB40
你可以使用 onkeydown,这样做是可以的。但如果你有事件对象,你可以获取 event.which,并且应该能够获取键位位置,如果需要的话,完全可以阻止数字键盘的输入。 - Raynos
我没有整个事件,只有keyCode和两个布尔值来表示控制键和Shift键是否被按下。 - LB40
4个回答

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);
}

Live example: http://jsfiddle.net/yahavbr/vwc7a/


3
从键码返回的数字映射到以下集合,如此处所定义。该集合不对应ASCII,但在某些方面类似。我会查看并寻找更多关于如何从数字中获取字符的信息。
另外,我建议您使用e.which而不是e.keyCode 作为进一步的评论,永远不要相信w3schools。
看一下e.originalEvent.keyIdentifier,它似乎包含一些Unicode。但它仍将数字键盘映射到A-H而不是0-9。我认为它只是讨厌数字键盘。应该有一个布尔值numpad标志。DOM3 API确实有一个布尔值numpad。
结果e.originalEvent.keyLocation === 3当您按数字键盘上的1时。
来自W3规范

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的keycode中减去48,以将A-H映射为0-9
[重要声明]
这是FF和Chrome所做的。上帝知道IE会做什么,您可以自己征服那个野兽。我毫不怀疑它与W3规范完全不同。

3
keyCodecharCode是不同的概念。 keyCode与键盘和键位布局有关,而charCode实际上给出了ASCII字符代码。

此外,不同的键盘事件实现中存在许多问题。我一直认为这个页面是一个很好的资源: http://unixpapa.com/js/key.html

编辑:正如Raynos所说,在谷歌搜索中遇到w3schools时,请跳过它。


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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接