显然,web应用程序需要根据用户的键盘设置进行调整,对吗?是否有一种方法可以告诉Dojo连接到实际的KeyPress事件而不是KeyDown,这样我们就可以从event.charCode
获得字符类型?
由于我们生活在一个国际化的世界,有多种操作系统等等,这些信息不足以找出用户实际输入的字符,除非我在浏览器中内置了一些功能来询问操作系统。
作为一个例子,在Linux上的德语键盘上,通过Alt Gr-8到达[,它发送一个Alt键,然后发送一个[键。好吧,忽略第一部分。在使用德语键盘的windows系统上,第二个事件是ctrlKey和altKey设置为true的8。我不认为JavaScript代码应该解释硬编码,因为与其他键盘设置,这个键组合实际上意味着一个不同的字符。
作为另一个例子(可能没有连接到Dojo,而是一个不同的程序员的小故障,抱歉的大喊大叫…),在mac上使用美国键盘,你不能在outlook web界面中输入德语字符-因为outlook虚假地(!)劫持了alt键(在mac上专门用于修改输入的字符)来触发操作,alt-s因此被重新映射为表示发送。当然,通常是在单词中间。
event.charCode
包含由键盘按下产生的字符,而不是实际按下的键。
https://developer.mozilla.org/en/DOM/event.charCode笔记
在按键事件中,按下的键的Unicode值存储在keyCode或charCode属性中,而不是同时存储在两者中。如果按下的键产生一个字符(例如:'a'), charCode被设置为该字符的代码,考虑到字母大小写
edit:也请参阅https://developer.mozilla.org/en/Gecko_Keypress_Event,它包含了关于charCode如何工作的更有见地的解释(特别是在Gecko中,但其中一些也适用于其他浏览器)。您可能会觉得这很有趣:
…当当前选择的键盘布局产生一个Unicode字符(根据CapsLock和NumLock的当前状态)时,charCode属性包含该字符
您可以将传递给dojo.connect()
的第5个dontFix
参数设置为true,这告诉它让它按原样通过,而不进行特殊处理。看到https://github.com/dojo/dojo/blob/master/_base/connect.js L32
使用keypress
事件,其目的是为您提供有关用户键入的字符的信息。你需要(奇怪的)keyCode
属性在IE和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));
};