コンテンツへスキップ

Barcode Scanner Emulator

メモ帳では動くが POS では動かない

これは最も多く報告されるバーコードの問題の一つで、ほぼいつもスキャナーと接続は正常です。不具合は、アプリケーションがキーボード入力を扱う方法にあります。

問題

プレーンテキストエディタへスキャンすると毎回正しい値が出ますが、POS、Web アプリ、社内ツールへスキャンすると、何も出ない、一部だけ入る、または誤った動作になります。

考えられる原因

  • スキャン時点で対象フィールドにキーボードフォーカスがない、またはフォーカスが入力要素以外にある
  • keydown ハンドラが文字入力を妨げる形で preventDefault() を呼んでいる
  • アプリが paste や input イベントに依存しており、スキャナーのキー入力が期待どおりにはそれらを起こさない
  • 入力マスクや検証の正規表現が、スキャンデータ内の妥当な文字を拒否している
  • ENTER/TAB の接尾辞が意図しない動作を起こしている(フォームの早すぎる送信、モーダルを閉じる、別の画面へ移動する)
  • スキャンが、デバウンスまたはスロットルされた入力ハンドラがすべてのキー入力を登録できるより速い

診断の手順

  1. 同じブラウザで キーボードイベントテスター を開き、バーコードをスキャンします。ここで全文字が正しく記録されるなら、ブラウザと OS はイベントを正常に受け取っています。不具合はアプリのイベント処理にあります。
  2. 実際のワークフローで、スキャンの直前に入力フィールドがフォーカスされているかを確認します。テストのために手でクリックしたときだけではありません。
  3. ブラウザの DevTools コンソールを開き、スキャン中に投げられた JavaScript エラーを確認します。ハンドラの途中でエラーが投げられると、それ以降のキー入力の処理が黙って止まります。
  4. 入力マスク、検証、デバウンスのロジックを一時的に外して再テストし、どの層が入力を落としているかを切り分けます。
  5. アプリが keydown/keyup ではなく keypress(非推奨で、一部のキーでは信頼できない)を監視していないか確認します。

修正方法

  • ワークフローがスキャンを期待するときは、対象フィールドをプログラムからフォーカスします(たとえば明細行を追加した直後)
  • keypress のリスナーを keydown/keyup に置き換えます。keypress は非推奨で、一部のキーの扱いが一貫しません
  • キーボードハンドラ内の preventDefault() 呼び出しを調べ、正当な文字キーを妨げていないことを確認します
  • 入力マスクと検証を緩め、バーコードのシンボル体系が出し得る文字範囲全体を受け付け、個々のキー入力ではなく組み立てた値を検証します
  • スキャナーの接尾辞をフォームが期待するものに合わせます(ENTER と TAB の接尾辞 を参照)

関連ツール

キーボードイベントテスター · バーコード入力テスター