Track presses as state, not repeated movement events
On keydown, add the relevant key to a Set; during the update step, read that set to decide movement. On keyup, remove it. This avoids treating operating-system key-repeat events as the game's movement clock. Also ignore a second keydown for a key already held when the action should begin only once, such as firing a single charged shot. MDN describes that holding a key can produce repeated keydown events, and KeyboardEvent.repeat can identify those repeated events in supported browsers.
Choose which keys count as game controls and leave text fields alone. If a prompt or name-entry field has focus, movement handlers should not consume the same characters. Prevent browser defaults such as page scrolling only for controls that genuinely need that behavior, and restore the normal page behavior when the player exits the game area.
Clear the set on interruption and state changes
Clear held input when the window blurs, the document becomes hidden, a pause overlay takes control, or the run resets. A visibilitychange handler can check document.hidden and clear the set when it becomes true. Do not clear blindly on every frame or pointer move; tie clearing to an interruption where a keyup may not arrive. Make the game require a fresh keydown after resume rather than resuming old movement automatically.
Reproduce the interruption paths
Hold left and switch tabs, hold jump and open a menu, and press a direction while a restart happens. On returning to play, verify that the character stays still until another deliberate press. Repeat with two simultaneous keys, such as right plus jump, and ensure clearing one key does not leave the other latched. Include keyboard focus changes between game controls and a text input.
Questions about prevent stuck keys in browser games
Why can a key remain held after I release it?
The game may not receive or process the matching keyup when focus changes or an overlay takes control. Resetting held state on those interruption paths gives the player a clean resume.
Should key repeat control character movement?
For continuous motion, track held state and update movement in the game loop. Repeat is more useful for distinguishing repeated keydown events from the initial press when an action should happen once.