我有一个奇怪的情况,一个特殊的 PC 键盘在按下数字键时会在 JavaScript 中产生奇怪的代码。
使用这个网站(http://unixpapa.com/js/testkey.html),我发现键盘在按下数字 4 时会产生这个:
keydown keyCode=18 which=18 charCode=0
keydown keyCode=101 (e) which=101 (e) charCode=0
keyup keyCode=101 (e) which=101 (e) charCode=0
keydown keyCode=98 (b) which=98 (b) charCode=0
keyup keyCode=98 (b) which=98 (b) charCode=0
keyup keyCode=18 which=18 charCode=0
keypress keyCode=52 (4) which=52 (4) charCode=52 (4)
一个普通的键盘会产生这个:
keydown keyCode=52 (4) which=52 (4) charCode=0
keypress keyCode=52 (4) which=52 (4) charCode=52 (4)
keyup keyCode=52 (4) which=52 (4) charCode=0
所以基本上,这个奇怪的设备持有 ALT 键,添加另外两个字符,放开 ALT 键,然后只触发实际键的 keypress 事件,同时完全忽略 keydown 和 keyup。
event.altKey
我可以毫无问题地过滤掉第一部分,但导致问题的是其余部分。
问题是我的代码被编写为在 keydown 上做一件事,在 keyup 上做另一件事,并且仅为这个键盘添加 keypress 会搞砸一切......
我怀疑是否有解决方案,我们可能只是不支持这个......奇怪的硬件,但以防万一:
关于如何检测键盘是否仅创建按键(在此之前过滤掉其他event.altKey
事件之后)的任何想法?
我尝试拥有一个包含当前事件代码的全局变量,并且在 keypress 和 keyup 上都被重置,否则接收当前的 keycode,但我无法让它工作......
这是我的代码:
<input type="text" name="entry" id="entry" onkeyup="Entry('up', this, event);" onkeydown="Entry('down', this, event);" />
是的,所有键盘事件都应该传递到文本字段中,所以return
这里不需要。和 JavaScript:
function Entry(dir, field, evt)
{
// filter out Num Lock, Alt and Alt Pressed
if (evt.keyCode == 144 || evt.keyCode == 18 || evt.altKey)
return false;
if (dir == 'up') // keyup
{
if (field.value.length > 0)
{
if (evt.keyCode == 13) // Enter pressed
{
EnterUser(); // if more entries are found with FindUser(), select the first one, otherwise empty the screen
}
else
{
FindUser(); // start ajax that checks field content vs database
}
}
}
else // keydown
{
if (!field.disabled)
{
EmptyScreen(); // if the text field is disabled because a dialog box is in front, empty the screen.
}
}
}
当然,诀窍是支持这种奇怪的键盘,同时不破坏当前正在工作的其他键盘和条形码扫描仪的东西。
有可能我们必须告诉客户“对不起,给自己找个合适的键盘”之类的,但这让我很烦 :-)
对此有什么想法吗?
谢谢!
PS:我在那个网站上有 jQuery,所以如果有任何使用它的好主意,我也会玩。