Barcode Scanner Emulator
扫描器在 Notepad 中可用但在 POS 中不可用
这是报告最多的条码问题之一,而且几乎总是说明扫描器和连接都正常——缺陷在于应用如何处理键盘输入。
问题
扫进纯文本编辑器每次都能得到正确值,但扫进 POS 系统、Web 应用或内部工具时却一无所获、只有部分输入,或行为不正确。
可能原因
- 扫描时目标字段没有键盘焦点,或者焦点在非输入元素上
keydown处理程序以阻止字符输入的方式调用了preventDefault()- 应用依赖
paste或input事件,而扫描器按键并不会按你期望的方式自然触发它们 - 输入掩码或校验正则拒绝了扫描载荷中的某个合法字符
- ENTER/TAB 后缀触发了非预期动作(过早提交表单、关闭模态框、离开当前页面)
- 扫描速度快于带防抖或节流的输入处理程序所能登记的每一次按键
诊断流程
- 在同一浏览器中打开键盘事件测试器并扫描条码。如果这里每个字符都正确记录,说明浏览器和操作系统正常收到事件,缺陷在应用的事件处理。
- 检查真实流程中、扫描发生之前输入框是否已聚焦(不只是测试时你手动点进去的情况)。
- 打开浏览器 DevTools 控制台,查看扫描期间抛出的 JavaScript 错误。处理程序中途抛错可能悄悄停止后续按键的处理。
- 暂时去掉输入掩码、校验或防抖逻辑再测,以隔离是哪一层丢掉了输入。
- 检查应用是否监听已弃用且对部分按键不可靠的
keypress,而不是keydown/keyup。
如何修复
- 每当流程期望扫描时,都以编程方式聚焦目标字段(例如刚添加一行之后)
- 用
keydown/keyup替换keypress监听器,因为keypress已弃用,并且对某些键处理不一致 - 审查键盘处理程序中的
preventDefault()调用,确保它们不拦截合法字符键 - 放宽输入掩码和校验,使其接受条码码制可能产生的全部字符范围,然后校验组装后的值,而不是单个按键
- 使扫描器后缀与表单预期一致(见ENTER 与 TAB 后缀)