【发布时间】:2017-03-13 09:43:49
【问题描述】:
范围
我正在尝试使用 JavaScript 在一个简单的 Web 应用程序中检测来自集成到手持 Android 设备中的条形码扫描仪的字符输入。由于大多数条形码扫描仪的行为类似于键盘楔子,因此我使用检测事件 keypress 和/或 keyup 来解释和处理字符输入。
我不希望字符输入填充文本输入,因此我已将事件处理程序分配给 document,但是,我知道我也可以将其分配给 window。
示例代码
我完成任务的示例代码如下所示; 这个示例没有区分键盘输入和扫描仪输入,但我已经解决了这个问题。
var barcodeString = "";
$(document).keypress(function (event) {
// If character is carriage-return prevent submit.
if (event.which === 13) {
event.preventDefault();
}
// Append other characters to barcodeString.
barcodeString += event.key;
});
问题
我的问题是许多设备根本不返回任何可读字符。当我使用 event.keyCode 监视字符代码时,我收到两个代码:229 和 13。这篇文章 W3 keyCode in key events 和这个 StackOverflow 答案 Is it OK to ignore keydown events with keyCode = 229? 概述了 229 代码意味着输入监视器正忙。我只能假设这是因为:
- 条形码扫描器会在插入字符时锁定输入监视器。
- 字符输入的速度导致输入监视器变得太忙而无法检测字符输入。
有趣的是,如果我在将文本扫描到文本输入时检测到event.keyCode,则会检测到两个字符代码:229 和 13,然后仅将文本插入到文本输入中.
设备
我尝试在其上实现此功能的设备是 Handheld Group 制造的 Nautiz X2。还有另一台 Android 设备,我无法识别其品牌,但使用不同的条码扫描软件似乎更通用。
解决方法
1
Handheld Group 确实提供了用于与手持式扫描仪交互的 JavaScript API。其工作方式是他们为名为:Kiosk Browser 的自定义浏览器提供了一个 APK,并在那里实现对特定于扫描仪的 JavaScript 的解释。可以在此处找到文档(它非常短且不长):JavaScript Scanner Interface
2
更通用的 Android 设备能够“减慢”扫描仪上的字符输入,使扫描仪与第三方应用程序更兼容。看哪,切换这个选项可以让我检测字符输入。虽然event.key 总是返回代码229(这次是从一个不可读的字符),但String.fromCharCode(event.which) 会在一定程度上解决这个问题(它不处理特殊字符)。 Nautiz X2 在软件设置中没有“减慢”输入的选项。
3
我考虑过的另一种解决方法是将文本输入放到网页上,样式为 display: none 以隐藏它并使用 JavaScript 不断将焦点设置在输入上。我可以尝试监视onChange 并处理字符输入。我真的很想避免这种方法。
总结
我提出的解决方法看起来很糟糕,而且第一种方法与设备无关。我想知道是否有更好的地方从条形码扫描仪“转储”文本输入,以便我可以在我的应用程序中处理它?或者,是否有可以监控的事件来检测字符输入?
【问题讨论】:
-
你解决过这个问题吗? :D 我现在有这个确切的问题。您的任何解决方法都不可行。不断关注输入(workaround3)不断打开扫描仪上的android软键盘
标签: javascript android jquery css barcode-scanner