Javascript 处理仅产生按键而非按键向下/按键向上事件的键盘
我有一个奇怪的情况,一个特殊的PC键盘在按下数字键时会产生奇怪的JavaScript代码 使用此网站,我发现键盘在按数字4时会产生这种效果:Javascript 处理仅产生按键而非按键向下/按键向上事件的键盘,javascript,jquery,events,event-handling,Javascript,Jquery,Events,Event Handling,我有一个奇怪的情况,一个特殊的PC键盘在按下数字键时会产生奇怪的JavaScript代码 使用此网站,我发现键盘在按数字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=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上做一件事,在keydup上做另一件事,而只为这一个键盘添加keypress就把一切都搞糟了
我怀疑是否有解决方案,我们可能只是不支持这个。。。奇怪的硬件,但以防万一:
关于如何检测键盘在过滤掉其他event.altKey事件之后是否只创建keypress,您有什么想法吗
我试着使用一个全局变量,该变量包含当前事件代码,并且在keypress和keyup上重置,否则将接收当前的keycode,但我就是无法让它工作
这是我的密码:
<input type="text" name="entry" id="entry" onkeyup="Entry('up', this, event);" onkeydown="Entry('down', this, event);" />
当然,诀窍是支持这种奇怪的键盘,同时不破坏目前正在工作的其他键盘和条形码扫描仪
很可能,我们必须向客户道歉,给自己买一个合适的键盘或其他东西,但这让我感到困扰:-
有什么想法吗
谢谢
PS:我在那个网站上有jQuery,所以如果有任何好的想法使用它,我也会是游戏玩家。我也偶然发现了这个问题。配置为以alt代码发送文本的条形码扫描器也会执行此操作 至少Chrome有一个简单的解决方案,我还没有检查firefox,但IE和Edge都需要一种不同的方法,因为这些浏览器无法为Alt键引发KeyUp事件,而Alt键是解决方案的关键部分 Google chrome注册Alt keyUp事件,该事件转换Alt代码。您只需在按住Alt键的同时跳过键,并在Alt KeyUp事件中检查key属性: 对于IE和Edge浏览器,您需要在按住alt键的同时保存字符,将它们转换为数字,然后使用String.fromCharCode057获取9,问题是很难检测何时转换,因为alt代码后alt按钮没有KeyUp事件 我选择的解决方案适用于我认为的每个浏览器,就是将隐藏的输入字段集中在Alt-key的KeyDownevent上,并在更改后读取其内容,因为输入可以正确处理Alt代码
这可能是迟来的答案,但可能对其他人有用。胡乱猜测:您可以尝试使用addEventListener来连接您的事件处理程序,以防传递给该回调的事件对象与在HTML中使用onkeyup得到的事件对象有所不同/更好。您已经解释了该键盘的功能,但你知道为什么会这样吗?它是为残疾人设计的可编程键盘吗?如果是这样,它可能有一个正常模式。据我所知,它是某种形式的出纳或POS键盘。我希望它可以被重新编程,不这样做:-今天回家,明天继续回复,谢谢!此行为可能会因运行的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.
}
}
}