无法检测Android条形码扫描仪输入的关键事件,JavaScript 范围

无法检测Android条形码扫描仪输入的关键事件,JavaScript 范围,javascript,android,jquery,css,barcode-scanner,Javascript,Android,Jquery,Css,Barcode Scanner,我正在尝试使用JavaScript在一个简单的web应用程序中检测集成到手持Android设备中的条形码扫描仪的字符输入。由于大多数条形码扫描仪的行为类似于键盘楔块,我使用检测事件keypress和/或keypup来解释和处理字符输入 我不希望字符输入填充文本输入,因此我已将事件处理程序分配给文档,但是,我知道我也可以将其分配给窗口 示例代码 我完成任务的示例代码如下所示;这个示例没有区分键盘输入和扫描仪输入,但我已经解决了这个问题 问题 我的问题是,许多设备根本不返回任何可读字符。当我使用ev

我正在尝试使用JavaScript在一个简单的web应用程序中检测集成到手持Android设备中的条形码扫描仪的字符输入。由于大多数条形码扫描仪的行为类似于键盘楔块,我使用检测事件
keypress
和/或
keypup
来解释和处理字符输入

我不希望字符输入填充文本输入,因此我已将事件处理程序分配给
文档
,但是,我知道我也可以将其分配给
窗口

示例代码 我完成任务的示例代码如下所示;这个示例没有区分键盘输入和扫描仪输入,但我已经解决了这个问题

问题 我的问题是,许多设备根本不返回任何可读字符。当我使用
event.keyCode
监视字符代码时,我收到两个代码:229和13。这篇文章和这个StackOverflow答案概括了229代码意味着输入监视器正忙。我只能假设这是因为:

  • 条形码扫描仪在插入字符时锁定输入监视器
  • 字符输入的速度导致输入监视器太忙,无法检测字符输入
有趣的是,如果我在将文本扫描到文本输入时检测到
event.keyCode
,则会检测到两个字符代码:229和13,然后才将文本插入文本输入

装置 我试图在其上实现此功能的设备是由掌上电脑集团制造的Nautiz X2。还有另一款安卓设备,我无法确定它的品牌,但它似乎更通用,带有不同的条形码扫描软件

权变措施 1. 手持组确实提供了一个JavaScript API,用于与手持扫描仪交互。其工作方式是,它们为名为kioskbrowser的定制浏览器提供APK,并实现特定于扫描仪的JavaScript解释。文档可以在这里找到(非常简短,阅读时间不长):

2. 更通用的Android设备能够“减慢”扫描仪上的字符输入,使扫描仪与第三方应用程序更兼容。注意,切换此选项可以检测字符输入。虽然
event.key
总是返回代码229(这次来自不可读的字符),但是
String.fromCharCode(event.which)
将在一定程度上解决问题(它不处理特殊字符)。Nautiz X2在软件设置中没有“减慢”输入的选项

3. 我考虑过的另一种解决方法是使用样式
display:none
将文本输入放到网页上,以隐藏文本输入,并使用JavaScript持续设置输入焦点。I可以尝试监视
onChange
并处理字符输入。我真的希望避免这种做法

总结
我所介绍的解决方法看起来很糟糕,第一个不是独立于设备的。我想知道是否有更好的地方可以“转储”条形码扫描仪输入的文本,以便在我的应用程序中处理它?或者,是否有我可以监控的事件来检测字符输入?

我知道这已经晚了,但我在Zebra TC20和Chainway C71等一系列设备上也面临类似的问题。经过大量的搜索,我找到了Bob Jase的这个惊人的代码笔样本。他已经在代码中记录了他的解决方案,但出于存档目的,我将在这里重新发布它

他的解决方案使用隐藏元素将焦点从可见元素更改为可见元素,从而隐藏android软键盘

//每当可视字段聚焦时
$(“#visibleField”).bind(“焦点”,函数(e){
//无声地将焦点移动到隐藏的选择框
$(“#hiddenField”).focus();
$(“#cursorMeasuringDiv”).css(“font”),$(“#visibleField”).css(“font”);
});
//每当用户在选择框中的键盘上键入
//本机支持跳转到
$(“#hiddenField”).bind(“按键”,函数(e){
//获取只读字段的当前值
var currentValue=$(“#visibleField”).val();
//并将用户按下的键附加到该字段中
$(“#visibleField”).val(currentValue+e.key);
$(“#cursorMeasuringDiv”).text(currentValue+e.key);
//测量光标偏移的宽度
var偏移=3;
var textWidth=$(“#cursorMeasuringDiv”).width();
$(“#hiddenField”).css(“marginLeft”,Math.min(offset+textWidth,$(“#visibleField”).width());
});
#hiddenField{
高度:17px;
宽度:1px;
位置:绝对位置;
左边距:3倍;
边缘顶部:2倍;
边界:无;
边框宽度:0px 0px 0px 1px;
}
#游标测量div{
位置:绝对位置;
可见性:隐藏;
边际:0px;
填充:0px;
}
#希登菲尔德:聚焦{
边框:1px纯色灰色;
边框宽度:0px 0px 0px 1px;
大纲:无;
动画名称:光标;
动画持续时间:1s;
动画迭代次数:无限;
}
@关键帧光标{
从{opacity:0;}
到{opacity:1;}
}

单击该字段并键入(即使该字段没有真正聚焦,它也应该可以工作):

输入:


您解决过这个问题吗?:我现在正面临着这个问题。你的任何变通办法都不可行。不断聚焦输入(解决方法3)不断打开扫描仪上的android软键盘
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;
});