Javascript 如何区分扫描仪输入和键盘输入?
How do I distinguish between a scanner input and keyboard input in Javascript?
我仔细阅读了答案,发现了两种有助于区分扫描仪输入和键盘输入的方法。可以通过:
基于时间:扫描仪输入比手动键盘输入快。
基于前缀: 将前缀附加到条形码或扫描仪(内置在扫描仪设备中)并使用它来识别扫描仪输入。
以下是链接:link 1, link 2 我已将其用作参考。
我 运行 遇到的问题是,每当用户在触发扫描事件时手动键入一些键盘键时,它就会被添加到扫描仪输入中并导致不一致的结果。
这是我使用的代码:
var BarcodeScannerEvents = function(){
this.initialize.apply(this, arguments);
};
BarcodeScannerEvents.prototype = {
initialize: function() {
$(document).on({
keypress: $.proxy(this._keypress, this)
});
},
_timeoutHandler: 0,
_inputString: '',
_keypress: function (e){
if(this._timeoutHandler){
clearTimeout(this._timeoutHandler);
}
this._inputString += String.fromCharCode(e.which);
//CHECKS FOR VALID CHARACTERS WHILE SCANNING
this._timeoutHandler = setTimeout($.proxy(function(){
if(this._inputString.length <= 10){
this._inputString = '';
return;
}
$(document).trigger('barcodescanned', this._inputString);
this._inputString = '';
}, this), 20);
}
};
new BarcodeScannerEvents();
我的条形码格式是:~xxx-xxx-xxxxxx 其中 x 可以是 0-9 之间的任何数字。如果将数字字符附加到条形码,则会导致数据库中的错误插入。
我曾尝试比较键盘输入和扫描仪输入的事件,但无济于事。我想过在每个数字之前附加额外的字符,然后如果出现连续数字则使扫描的条形码无效。但我认为这不是解决此问题的最佳方法。有人可以帮我吗?
不需要从keyboard/barcode扫描仪判断。
如果您决定在任何设备上将 Enter(Carriage Return) 键通知作为输入完成,您可以将其用作最简单的触发器来执行 Price Look Up/input 值验证。
大多数扫描器都可以在扫描的条码数据中添加后缀代码以进行通知。
最常用的是回车键,但也可以使用Tab键。
通过条码扫描器发送后缀码,扫描器通知和按键输入混合的可能性比超时检测低很多。
您可以进行如下操作。
- 使用设置条码,设置为通知通常不包含在条码中的键,如Enter、Tab等作为后缀。
- 将相应后缀键的事件侦听器绑定到文本输入字段。
- 事件监听中判断键码,如果是后缀键,则认为条码数据输入完成,进行Price Look Up/input值校验等处理,并将输入焦点移动到下一个字段。
例如看这篇文章。
execute function on enter key
另外:
你的担忧似乎被不常发生的情况压倒了。
如果真的碰巧出了问题,你应该放弃处理JavaScript。
请通过以下方法使用其他程序获取扫描仪数据。请以某种方式通知应用程序。
如果要继续模拟键盘输入,最好在通知浏览器或应用程序之前捕获数据。
SetWindowsHookExW function / LowLevelKeyboardProc callback function
EasyHook / Indieteur/GlobalHooks
hook into linux key event handling / uinput-mapper
The Linux keyboard driver / LKL Linux KeyLogger / kristian/system-hook
system wide keyboard hook on X under linux / Error when trying to build a Global Keyboard Hook in Ubuntu Linux / 10.5.2 Keyboard and Pointer Events
或者,将扫描仪设置为串口模式,并有专门的程序接收它。
Serial API
JavaScript/JQuery communicate with SerialPort/COM1
问题已标记 opos / Questions tagged pos-for-.net / Questions tagged javapos
我的第一个答案是训练用户在扫描时不要触摸键盘。但是,您对答案和评论的回应语气让人觉得您更多的是在考虑恶意的、有意的破坏数据的尝试。
除了 kunif 的非常详尽的回答之外,您不会找到解决您正在设想或 运行 遇到的问题的方法。原因是 JavaScript 只会从操作系统的输入缓冲区接收; JS 不会(不能!出于 OS 安全原因)区分输入缓冲区的填充方式。如果击键和扫描数据同时被放入缓冲区,这是一个试图在 OS 或硬件级别解决的问题。 JavaScript只是没有能力对付它。
我仔细阅读了答案,发现了两种有助于区分扫描仪输入和键盘输入的方法。可以通过:
基于时间:扫描仪输入比手动键盘输入快。
基于前缀: 将前缀附加到条形码或扫描仪(内置在扫描仪设备中)并使用它来识别扫描仪输入。
以下是链接:link 1, link 2 我已将其用作参考。
我 运行 遇到的问题是,每当用户在触发扫描事件时手动键入一些键盘键时,它就会被添加到扫描仪输入中并导致不一致的结果。
这是我使用的代码:
var BarcodeScannerEvents = function(){
this.initialize.apply(this, arguments);
};
BarcodeScannerEvents.prototype = {
initialize: function() {
$(document).on({
keypress: $.proxy(this._keypress, this)
});
},
_timeoutHandler: 0,
_inputString: '',
_keypress: function (e){
if(this._timeoutHandler){
clearTimeout(this._timeoutHandler);
}
this._inputString += String.fromCharCode(e.which);
//CHECKS FOR VALID CHARACTERS WHILE SCANNING
this._timeoutHandler = setTimeout($.proxy(function(){
if(this._inputString.length <= 10){
this._inputString = '';
return;
}
$(document).trigger('barcodescanned', this._inputString);
this._inputString = '';
}, this), 20);
}
};
new BarcodeScannerEvents();
我的条形码格式是:~xxx-xxx-xxxxxx 其中 x 可以是 0-9 之间的任何数字。如果将数字字符附加到条形码,则会导致数据库中的错误插入。
我曾尝试比较键盘输入和扫描仪输入的事件,但无济于事。我想过在每个数字之前附加额外的字符,然后如果出现连续数字则使扫描的条形码无效。但我认为这不是解决此问题的最佳方法。有人可以帮我吗?
不需要从keyboard/barcode扫描仪判断。
如果您决定在任何设备上将 Enter(Carriage Return) 键通知作为输入完成,您可以将其用作最简单的触发器来执行 Price Look Up/input 值验证。
大多数扫描器都可以在扫描的条码数据中添加后缀代码以进行通知。
最常用的是回车键,但也可以使用Tab键。
通过条码扫描器发送后缀码,扫描器通知和按键输入混合的可能性比超时检测低很多。
您可以进行如下操作。
- 使用设置条码,设置为通知通常不包含在条码中的键,如Enter、Tab等作为后缀。
- 将相应后缀键的事件侦听器绑定到文本输入字段。
- 事件监听中判断键码,如果是后缀键,则认为条码数据输入完成,进行Price Look Up/input值校验等处理,并将输入焦点移动到下一个字段。
例如看这篇文章。
execute function on enter key
另外:
你的担忧似乎被不常发生的情况压倒了。
如果真的碰巧出了问题,你应该放弃处理JavaScript。
请通过以下方法使用其他程序获取扫描仪数据。请以某种方式通知应用程序。
如果要继续模拟键盘输入,最好在通知浏览器或应用程序之前捕获数据。
SetWindowsHookExW function / LowLevelKeyboardProc callback function
EasyHook / Indieteur/GlobalHooks
hook into linux key event handling / uinput-mapper
The Linux keyboard driver / LKL Linux KeyLogger / kristian/system-hook
system wide keyboard hook on X under linux / Error when trying to build a Global Keyboard Hook in Ubuntu Linux / 10.5.2 Keyboard and Pointer Events
或者,将扫描仪设置为串口模式,并有专门的程序接收它。
Serial API
JavaScript/JQuery communicate with SerialPort/COM1
问题已标记 opos / Questions tagged pos-for-.net / Questions tagged javapos
我的第一个答案是训练用户在扫描时不要触摸键盘。但是,您对答案和评论的回应语气让人觉得您更多的是在考虑恶意的、有意的破坏数据的尝试。
除了 kunif 的非常详尽的回答之外,您不会找到解决您正在设想或 运行 遇到的问题的方法。原因是 JavaScript 只会从操作系统的输入缓冲区接收; JS 不会(不能!出于 OS 安全原因)区分输入缓冲区的填充方式。如果击键和扫描数据同时被放入缓冲区,这是一个试图在 OS 或硬件级别解决的问题。 JavaScript只是没有能力对付它。