web-dev-qa-db-ja.com

JavaScriptでスキャナー入力とキーボード入力を区別するにはどうすればよいですか?

私は答えを調べましたが、スキャナーとキーボードの入力を区別するのに役立つ2つの方法に出会いました。これは次の方法で実行できます。

  • 時間ベース: スキャナー入力は、手動キーボード入力よりも高速です。

  • プレフィックスベース: プレフィックスをバーコードまたはスキャナー(スキャナーデバイスに組み込まれている)に追加し、それを使用してスキャナー入力を識別します。

ここにリンクがあります: 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の任意の数値です。数字である文字がバーコードに追加されると、データベースに誤って挿入されます。

キーボード入力とスキャナー入力からのイベントを比較してみましたが、役に立ちませんでした。各数字の前に余分な文字を追加し、連続した数字が表示された場合はスキャンしたバーコードを無効にすることを考えました。しかし、これがこの問題に取り組む最良の方法だとは思いません。誰かが私をここで助けてくれますか?

12
shaivik

キーボード/バーコードスキャナーから判断する必要はありません。
Enter(Carriage Return)キー通知を任意のデバイスの入力完了として決定した場合、それを最も単純なトリガーとして使用して、価格検索/入力値検証を実行できます。

ほとんどのスキャナーは、通知用にスキャンしたバーコードデータにサフィックスコードを追加できます。
最も一般的に使用されるのはEnterキーですが、Tabキーも使用できます。
バーコードスキャナーによってサフィックスコードを送信することにより、スキャナー通知とキー入力が混在する可能性は、タイムアウト検出よりもはるかに低くなります。

次のように行うことができます。

  • 設定バーコードを使用して、通常はバーコードにサフィックスとして含まれないEnter、Tabなどのキーを通知するように設定されています。
  • 対応するサフィックスキーのイベントリスナーをテキスト入力フィールドにバインドします。
  • キーリスナーはイベントリスナーで判定され、サフィックスキーの場合はバーコードデータの入力が完了したものとみなし、価格検索/入力値検証などの処理を行い、入力フォーカスを次のフィールド。

たとえば、この記事を参照してください。
Enterキーで機能を実行


さらに:
あなたの心配は、頻繁に発生しない状況に圧倒されているようです。

それが本当に問題になったら、JavaScriptの扱いをあきらめてください。
以下の方法で他のプログラムでスキャナーデータを取得してください。何らかの方法でアプリケーションに通知してください。

キーボード入力エミュレーションを続行する場合は、ブラウザまたはアプリケーションに通知される前にデータをキャプチャすることをお勧めします。

SetWindowsHookExW関数 / LowLevelKeyboardProcコールバック関数
EasyHook / Indieteur/GlobalHooks

Linuxキーイベント処理にフックする / input-mapper
Linuxキーボードドライバー / LKL Linux KeyLogger / kristian/system-hook
LinuxのXでシステム全体のキーボードフック / buntu Linuxでグローバルキーボードフックを構築しようとしたときのエラー / 10.5.2キーボードとポインターイベント


または、スキャナーをシリアルポートモードに設定し、それを受信するための専用プログラムを用意します。

シリアルAPI
JavaScript/JQueryはSerialPort/COM1と通信します

タグ付けされた質問 opos /タグ付けされた質問 pos-for-.net /タグ付けされた質問 javapos

9
kunif

私の最初の答えは、スキャン中にキーボードに触れないようにユーザーを訓練することです。ただし、回答やコメントへの応答のトーンは、データを破壊しようとする悪意のある意図的な試みをより考えているように聞こえます。

Kunifの非常に徹底的な答えを超えて、あなたはあなたが想像している、または遭遇している問題の解決策を見つけるつもりはありません。その理由は、JavaScriptがオペレーティングシステムの入力バッファからのみ受信するためです。 JSは(OSのセキュリティ上の理由から)入力バッファがどのように満たされているかを区別できません(できない!)。キーストロークとスキャンデータが同時にバッファに入れられる場合、それはOSまたはハードウェアレベルで対処しようとする問題です。 JavaScriptはそれを処理するために装備されていないだけです。

0
kcasarez