Barcode Scanner Emulator
Работает в Notepad, но не в POS
Это одна из самых частых жалоб на штрихкоды, и почти всегда сканер и подключение в порядке. Ошибка в том, как приложение обрабатывает клавиатурный ввод.
Проблема
Сканирование в простой текстовый редактор каждый раз даёт верное значение, а сканирование в систему POS, веб-приложение или внутренний инструмент не даёт ничего, даёт частичный ввод или неверное поведение.
Возможные причины
- У целевого поля в момент сканирования нет фокуса клавиатуры, или фокус на элементе, который не является полем ввода
- Обработчик
keydownвызываетpreventDefault()так, что блокирует ввод символов - Приложение опирается на события
pasteилиinput, которые нажатия сканера не вызывают так, как вы ожидаете - Маска ввода или регулярное выражение проверки отвергает допустимый символ считанных данных
- Суффикс ENTER/TAB вызывает нежелательное действие (слишком ранняя отправка формы, закрытие модального окна, переход в другое место)
- Сканирование быстрее, чем обработчик с debounce или throttle успевает зарегистрировать каждое нажатие
Ход диагностики
- Откройте тестер событий клавиатуры в том же браузере и отсканируйте штрихкод. Если каждый символ здесь записывается верно, браузер и операционная система получают события нормально, значит ошибка в обработке событий приложения.
- Проверьте, есть ли у поля фокус прямо перед сканированием в настоящем сценарии, а не только когда вы щёлкаете по нему вручную для теста.
- Откройте консоль DevTools браузера и поищите ошибки JavaScript во время сканирования. Ошибка в середине обработчика может молча остановить обработку следующих нажатий.
- Временно уберите маску ввода, проверку или логику debounce и повторите тест, чтобы понять, какой слой теряет ввод.
- Проверьте, слушает ли приложение
keypress(устарел и ненадёжен для части клавиш) вместоkeydown/keyup.
Как исправить
- Ставьте фокус на целевое поле программно, когда сценарий ждёт сканирование (например сразу после добавления строки)
- Замените слушатели
keypressнаkeydown/keyup, потому чтоkeypressустарел и обрабатывает часть клавиш непоследовательно - Просмотрите вызовы
preventDefault()в обработчиках клавиатуры, чтобы они не блокировали допустимые символьные клавиши - Ослабьте маски и проверку, чтобы принимать весь диапазон символов, который могут дать символики, и проверяйте собранное значение, а не отдельные нажатия
- Согласуйте суффикс сканера с тем, чего ждёт форма (см. Суффиксы ENTER и TAB)