Barcode Scanner Emulator
メモ帳では動くが POS では動かない
これは最も多く報告されるバーコードの問題の一つで、ほぼいつもスキャナーと接続は正常です。不具合は、アプリケーションがキーボード入力を扱う方法にあります。
問題
プレーンテキストエディタへスキャンすると毎回正しい値が出ますが、POS、Web アプリ、社内ツールへスキャンすると、何も出ない、一部だけ入る、または誤った動作になります。
考えられる原因
- スキャン時点で対象フィールドにキーボードフォーカスがない、またはフォーカスが入力要素以外にある
keydownハンドラが文字入力を妨げる形でpreventDefault()を呼んでいる- アプリが
pasteやinputイベントに依存しており、スキャナーのキー入力が期待どおりにはそれらを起こさない - 入力マスクや検証の正規表現が、スキャンデータ内の妥当な文字を拒否している
- ENTER/TAB の接尾辞が意図しない動作を起こしている(フォームの早すぎる送信、モーダルを閉じる、別の画面へ移動する)
- スキャンが、デバウンスまたはスロットルされた入力ハンドラがすべてのキー入力を登録できるより速い
診断の手順
- 同じブラウザで キーボードイベントテスター を開き、バーコードをスキャンします。ここで全文字が正しく記録されるなら、ブラウザと OS はイベントを正常に受け取っています。不具合はアプリのイベント処理にあります。
- 実際のワークフローで、スキャンの直前に入力フィールドがフォーカスされているかを確認します。テストのために手でクリックしたときだけではありません。
- ブラウザの DevTools コンソールを開き、スキャン中に投げられた JavaScript エラーを確認します。ハンドラの途中でエラーが投げられると、それ以降のキー入力の処理が黙って止まります。
- 入力マスク、検証、デバウンスのロジックを一時的に外して再テストし、どの層が入力を落としているかを切り分けます。
- アプリが
keydown/keyupではなくkeypress(非推奨で、一部のキーでは信頼できない)を監視していないか確認します。
修正方法
- ワークフローがスキャンを期待するときは、対象フィールドをプログラムからフォーカスします(たとえば明細行を追加した直後)
keypressのリスナーをkeydown/keyupに置き換えます。keypressは非推奨で、一部のキーの扱いが一貫しません- キーボードハンドラ内の
preventDefault()呼び出しを調べ、正当な文字キーを妨げていないことを確認します - 入力マスクと検証を緩め、バーコードのシンボル体系が出し得る文字範囲全体を受け付け、個々のキー入力ではなく組み立てた値を検証します
- スキャナーの接尾辞をフォームが期待するものに合わせます(ENTER と TAB の接尾辞 を参照)