У меня есть веб-приложение HTML5, которое работает как экран KVM с использованием WebSockets. В основном виртуальный монитор для моей удаленной машины. Проблема, которую я вижу, заключается в том, что когда я начинаю быстро (или непрерывно) печатать, один из символов печатается несколько раз.
Код таков, что нажатая / отпущенная клавиша передается в удаленную систему как протокол USB HID. Итак, согласно Протокол USB-HID,
When the OS receives a "press key" report, it writes the letter or uses it as a command as explained above. It will keep performing the same action, again and again, until it receives a "release key" report. When you press the letter 'a' on a USB keyboard, the following report will be sent over the USB interrupt pipe:
'a' report: [0, 0, 4, 0, 0, 0, 0, 0] This '4' value is the Keycode for the letter 'a', as described in USB HID Usage Tables (Section 10: Keyboard/Keypad Page). That document defines the report formats for all standardized HIDs.
After releasing the key, the following report will be sent:
null report: [0, 0, 0, 0, 0, 0, 0, 0] '4' is replaced with '0'; an array of zeros means nothing is being pressed.
Соответственно, веб-приложение HTML5 отправляет пакет для нажатия клавиши и отдельный пакет для отпускания клавиши. Он использует onKeyDown() для отправки события нажатия клавиши и onKeyUp() для отправки события отпускания клавиши.
Иногда событие onKeyUp() не принимается, что не позволяет приложению отправить событие отпускания клавиши, и, следовательно, нажатый символ продолжает печататься.
Итак, проблема в отсутствии события onKeyUp(). Как я могу гарантировать, что этого не произойдет? В чем могут быть причины? Я запускаю это в Chrome на Win 7.
Может ли быть альтернативное решение для достижения вышеуказанной задачи?
@JaredBledsoe да, это решает проблему, если я снова нажимаю клавишу, реальная проблема иногда возникает, когда необходимо выполнить некоторые настройки / установки, и на этих экранах, если клавиша «Enter» повторяется, это не позволяет пользователю установить их конфигурации. В этих сценариях проблема становится серьезной.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Насколько я знаю, однозначного ответа нет, поскольку клавиатура фактически не регистрирует это как «нажатие клавиши» или любую другую ситуацию, в которой она не регистрируется. Если вы снова нажмете кнопку, это должно исправить.