2011-09-01 40 views
1

显然,一个Web应用程序需要调整到用户的键盘设置,对吧?有没有办法告诉Dojo连接到实际的KeyPress事件而不是KeyDown,所以我们可以从event.charCode获得键入的字符?操作系统无关键盘事件到字符映射

由于我们生活在一个国际化的世界中,使用多种操作系统,不知道这些信息不足以找出用户实际键入的字符,除非我在浏览器中内置了一些功能来询问操作系统。

作为一个例子,在Linux上的德语键盘上,[通过Alt Gr-8到达,它发送一个keydown给Alt,然后给keydown发送一个[。好吧,忽略第一部分。在带有德语键盘的Windows系统上,第二个事件是ctrlKey和altKey设置为true的8。我不认为JavaScript代码应该解释为硬编码,因为在其他键盘设置下,这个组合键实际上意味着不同的字符。

作为另一个例子(可能没有连接到Dojo,而是一个不同的程序员的小故障,抱歉抱怨......),在美国的Mac键盘上,你不能在outlook web界面输入德语字符 - 因为outlook虚假(!)劫持alt键(mac上的键专门用于修改键入的字符)来触发操作,alt-s因此被重新映射为意味着send。当然,通常在一个词的中间。

+0

+1对于抨击Outlook。我曾经使用过的最糟糕的软件之一。 – shesek

回答

2

event.charCode包含从键盘按下时产生的字符,而不是按下的实际键。

https://developer.mozilla.org/en/DOM/event.charCode#Notes

在按键事件,按下的键的Unicode值被存储在任一键代码或则charCode属性,不可能兼顾。如果按下的键产生一个字符(如“A”),则charCode设为该字符的代码,尊重字母的大小写

编辑:也看https://developer.mozilla.org/en/Gecko_Keypress_Event,它包含了更深入的解释, charCode是如何工作的(特别是在Gecko中,但其中一些也适用于其他浏览器)。您可能会发现这个有趣的:

...当当前选择的键盘布局产生Unicode字符(按大写锁定和NumLock键的当前状态),中charCode属性包含字符

+0

你当然是对的 - 这里的问题就是“只是”dojo.connect(foo,“onkeypress”,this。this。onKeyPress)'连接到DOM事件KeyDown。哪个发送错误的值。我将编辑该问题。 –

+0

@Christopher:Dojo这样做?如果是这样,把它丢弃。 –

+0

@Tim,不幸的是,它[确实是](https://github.com/dojo/dojo/blob/master/_base/connect.js#L32)。我不使用道场,但我必须看看他们的来源,看他们是否真的做了这样的事情 – shesek

0

使用keypress事件,其目的是为您提供有关用户键入的字符的信息。您需要(奇怪)IE中的keyCode属性和其他浏览器中的which属性;这些给你输入的字符代码。

JavaScript的关键事件的最终页:http://unixpapa.com/js/key.html

document.onkeypress = function(e) { 
    e = e || window.event; 
    var charCode = (typeof e.which == "number") ? e.which : e.keyCode; 
    alert(String.fromCharCode(charCode)); 
};