如何区分JavaScript中的扫描器输入和键盘输入?

时间:2018-12-01 18:01:42

标签: javascript jquery barcode-scanner

我已经回答了所有问题,并遇到了两种方法,可以帮助区分扫描仪和键盘输入。可以通过以下方式完成:

  • 基于时间:扫描仪输入比手动键盘输入更快。

  • 基于前缀:为条形码或扫描仪(内置扫描仪设备)添加前缀,并使用它来识别扫描仪输入。

以下是链接:link 1link 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之间的任何数字。如果将数字字符附加到条形码上,则会导致数据库中的错误插入。

我尝试比较键盘输入和扫描仪输入的事件,但无济于事。我考虑过在每个数字前添加额外的字符,然后如果出现连续数字,则使扫描的条形码无效。但是我认为这不是解决此问题的最佳方法。有人可以帮我吗?

2 个答案:

答案 0 :(得分:9)

没有必要通过键盘/条形码扫描仪进行判断。
如果您在任何设备上将Enter(回车)键通知确定为输入完成,则可以将其用作执行价格查询/输入值验证的最简单触发器。

大多数扫描仪可以在扫描的条形码数据中添加后缀代码以进行通知。
最常用的是Enter键,但也可以使用Tab键。
通过条形码扫描仪发送后缀代码,扫描仪通知和按键输入混合在一起的可能性大大低于超时检测。

您可以执行以下操作。

  • 使用设置条形码,它被设置为通知通常不包含在条形码中的键(例如Enter,Tab等)作为后缀。
  • 为事件输入监听器绑定文本输入字段的相应后缀键。
  • 在事件侦听器中判断键码,如果它是后缀键,则假定条形码数据的输入已完成,执行诸如价格查找/输入值验证的处理,并移动输入专注于下一个领域。

例如,请参见本文。
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的问题/标记为pos-for-.net的问题/标记为javapos的问题

答案 1 :(得分:0)

我的第一个答案是训练用户在扫描时不要触摸键盘。但是,您对答案和评论的回应语调听起来似乎在想更多恶意的,有意破坏数据的尝试。

除了kunif的非常详尽的答案之外,您不会找到解决您正在设想或遇到的问题的解决方案。原因是JavaScript仅从操作系统的输入缓冲区中接收。 JS(出于操作系统安全原因,不能!)无法区分输入缓冲区的填充方式。如果将击键和扫描数据同时放入缓冲区,则要尝试在OS或硬件级别解决这个问题。 JavaScript只是不具备处理它的能力。