       # the missing characters.
       @simulateTextInput(event) if event.defaultPrevented and event.type is 'keydown'
 
+    # Manage the keystroke queue state. State is updated separately for clarity.
+
+    @bindingsToDisable.push(dispatchedExactMatch) if dispatchedExactMatch
     if hasPartialMatches and shouldUsePartialMatches
-      event.preventDefault()
-
       enableTimeout = (
         @pendingStateTimeoutHandle? or
         dispatchedExactMatch? or

            shouldUsePartialMatches = false

          if @dispatchCommandEvent(exactMatchCandidate.command, target, event)
            @emitter.emit 'did-match-binding', {
              keystrokes,
              eventType: event.type,
              binding: exactMatchCandidate,
              keyboardEventTarget: target
            }
            dispatchedExactMatch = exactMatchCandidate
            eventHandled = true # Kicks it out of the parent loop
            break
        currentTarget = currentTarget.parentElement

    @bindingsToDisable.push(dispatchedExactMatch) if dispatchedExactMatch

    if not dispatchedExactMatch? and not hasPartialMatches
      @emitter.emit 'did-fail-to-match-binding', {
        keystrokes,
        eventType: event.type,

    @queuedKeystrokes.push(keystroke)
    @queuedKeyboardEvents.push(event)
    keystrokes = @queuedKeystrokes.join(' ')

    # If the event's target is document.body, assign it to defaultTarget instead
    # to provide a catch-all element when nothing is focused.
