@@ -7,10 +7,13 @@ type PressedKeys = Set<string>
77type KeyOrCode = 'key' | 'code'
88
99export interface UseKeyPressOptions {
10- actInsideInputWithModifier ?: MaybeRefOrGetter < boolean >
1110 target ?: MaybeRefOrGetter < EventTarget | null | undefined >
11+ actInsideInputWithModifier ?: MaybeRefOrGetter < boolean >
12+ preventDefault ?: MaybeRefOrGetter < boolean >
1213}
1314
15+ const inputTags = [ 'INPUT' , 'SELECT' , 'TEXTAREA' ]
16+
1417export function isInputDOMNode ( event : KeyboardEvent ) : boolean {
1518 const target = ( event . composedPath ?.( ) ?. [ 0 ] || event . target ) as HTMLElement
1619
@@ -19,12 +22,12 @@ export function isInputDOMNode(event: KeyboardEvent): boolean {
1922 const closest = typeof target ?. closest === 'function' ? target . closest ( '.nokey' ) : null
2023
2124 // when an input field is focused we don't want to trigger deletion or movement of nodes
22- return [ 'INPUT' , 'SELECT' , 'TEXTAREA' ] . includes ( target ?. nodeName ) || hasAttribute || ! ! closest
25+ return inputTags . includes ( target ?. nodeName ) || hasAttribute || ! ! closest
2326}
2427
2528// we want to be able to do a multi selection event if we are in an input field
2629function wasModifierPressed ( event : KeyboardEvent ) {
27- return event . ctrlKey || event . metaKey || event . shiftKey
30+ return event . ctrlKey || event . metaKey || event . shiftKey || event . altKey
2831}
2932
3033function isKeyMatch ( pressedKey : string , keyToMatch : string , pressedKeys : Set < string > , isKeyUp : boolean ) {
@@ -88,6 +91,8 @@ export function useKeyPress(keyFilter: MaybeRefOrGetter<KeyFilter | boolean | nu
8891
8992 const target = toRef ( ( ) => toValue ( options ?. target ) ?? window )
9093
94+ const preventDefault = toRef ( ( ) => toValue ( options ?. preventDefault ) ?? true )
95+
9196 const isPressed = ref ( toValue ( keyFilter ) === true )
9297
9398 let modifierPressed = false
@@ -124,7 +129,12 @@ export function useKeyPress(keyFilter: MaybeRefOrGetter<KeyFilter | boolean | nu
124129 return
125130 }
126131
127- e . preventDefault ( )
132+ const target = ( e . composedPath ?.( ) ?. [ 0 ] || e . target ) as Element | null
133+ const isInteractiveElement = target ?. nodeName === 'BUTTON' || target ?. nodeName === 'A'
134+
135+ if ( ! preventDefault . value && ( modifierPressed || ! isInteractiveElement ) ) {
136+ e . preventDefault ( )
137+ }
128138
129139 isPressed . value = true
130140 } ,
0 commit comments