OnKeyDown和String.FromCharCode

时间:2011-01-25 12:55:05

标签: javascript javascript-events

我有一个关于OnKeyDown事件的问题。 OnKeyDown事件提供了一个KeyCode,但我不确切知道给出了什么样的代码。基本上,我使用String.FromCharCode方法从我认为的ASCII代码中获取真实字符。它工作正常,直到我尝试使用来自小键盘的数字。如果我使用'w'上方的键输入'2'即可,但是使用来自小键盘的'2',KeyCode给出的是98(这是'b'Ascii代码)。

我正在看这个page并且存在同样的问题。该示例应该阻止用户键入数字。它与第一个字符顶部的数字完美匹配(缺少更好的名称),但您可以使用数字键盘输入数字。

你知道问题是什么吗? (这真的是ascii代码吗?我使用了错误的事件吗?)...

... THX

4 个答案:

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

实例:http://jsfiddle.net/yahavbr/vwc7a/

答案 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)

keyCodecharCode是不同的动物。 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();
}