【问题标题】:How do I distinguish between a scanner input and keyboard input in Javascript?如何区分 Javascript 中的扫描仪输入和键盘输入?
【发布时间】:2018-12-01 18:01:41
【问题描述】:

我浏览了答案,发现了两种有助于区分扫描仪和键盘输入的方法。可以通过:

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

  • 基于前缀: 将前缀附加到条形码或扫描仪(内置在扫描仪设备中)并使用它来识别扫描仪输入。

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

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

【问题讨论】:

  • “它被添加到扫描仪输入” 让我相信您要解决的问题是对数据进行排队,而不是区分输入。我看到你已经设置了超时,但也许需要更正式的去抖动功能? davidwalsh.name/javascript-debounce-function
  • @jmargolisvt 抱歉延迟回复。我确实想区分扫描仪和键盘输入。这是因为当扫描仪读取条码时,由于键盘输入而发生一些按键事件,它会干扰条码并导致扫描错误。

标签: javascript jquery barcode-scanner


【解决方案1】:

无需通过键盘/条码扫描器判断。
如果您决定在任何设备上将 Enter(Carriage Return) 键通知作为输入完成,则可以将其用作执行价格查询/输入值验证的最简单触发器。

大多数扫描仪都可以在扫描的条码数据中添加后缀代码以进行通知。
最常用的是 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

【讨论】:

  • 抱歉耽搁了。感谢您的投入。但这并不能解决通过键盘输入篡改条码数据的问题。对此的任何帮助将不胜感激。
  • 感谢@kunif 的详细解释。 “你的担忧似乎被不常发生的情况所淹没” - 你的假设正确。我探索了使用捕获扫描仪输入的替代方法,但这需要大量的开发工作。我在想的是将当前 ~xxx-xxx-xxxxxx (x 可以是 0-9 之间的任何数字)的条形码格式更改为 ~x#x#xx#x #xx#x#x#x#x#x 并通过算法检查是否出现两个连续的数字/字符,丢弃扫描的输入。这样可以吗?
  • @shaivik,无法判断这是否可以仅用一点 cmets 完成。最好提出新问题并详细说明您想做什么以及您的想法。
【解决方案2】:

我的第一个答案是训练用户在扫描时不要触摸键盘。但是,您对答案和 cmets 的回应语气听起来像是您在考虑更多恶意的、有意破坏数据的尝试。

除了 kunif 非常彻底的回答之外,您不会找到解决您设想或遇到的问题的方法。原因是 JavaScript 只会从操作系统的输入缓冲区接收; JS 不会(不能!出于操作系统安全原因)区分输入缓冲区的填充方式。如果击键和扫描数据同时被放入缓冲区,这是一个尝试在操作系统或硬件级别解决的问题。 JavaScript 只是没有能力处理它。

【讨论】:

    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 2023-03-27
    • 2019-01-08
    • 2017-06-09
    • 1970-01-01
    • 2012-12-01
    相关资源
    最近更新 更多