@@ -7,10 +7,13 @@ type PressedKeys = Set<string>
7
7
type KeyOrCode = 'key' | 'code'
8
8
9
9
export interface UseKeyPressOptions {
10
- actInsideInputWithModifier ?: MaybeRefOrGetter < boolean >
11
10
target ?: MaybeRefOrGetter < EventTarget | null | undefined >
11
+ actInsideInputWithModifier ?: MaybeRefOrGetter < boolean >
12
+ preventDefault ?: MaybeRefOrGetter < boolean >
12
13
}
13
14
15
+ const inputTags = [ 'INPUT' , 'SELECT' , 'TEXTAREA' ]
16
+
14
17
export function isInputDOMNode ( event : KeyboardEvent ) : boolean {
15
18
const target = ( event . composedPath ?.( ) ?. [ 0 ] || event . target ) as HTMLElement
16
19
@@ -19,12 +22,12 @@ export function isInputDOMNode(event: KeyboardEvent): boolean {
19
22
const closest = typeof target ?. closest === 'function' ? target . closest ( '.nokey' ) : null
20
23
21
24
// 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
23
26
}
24
27
25
28
// we want to be able to do a multi selection event if we are in an input field
26
29
function wasModifierPressed ( event : KeyboardEvent ) {
27
- return event . ctrlKey || event . metaKey || event . shiftKey
30
+ return event . ctrlKey || event . metaKey || event . shiftKey || event . altKey
28
31
}
29
32
30
33
function isKeyMatch ( pressedKey : string , keyToMatch : string , pressedKeys : Set < string > , isKeyUp : boolean ) {
@@ -88,6 +91,8 @@ export function useKeyPress(keyFilter: MaybeRefOrGetter<KeyFilter | boolean | nu
88
91
89
92
const target = toRef ( ( ) => toValue ( options ?. target ) ?? window )
90
93
94
+ const preventDefault = toRef ( ( ) => toValue ( options ?. preventDefault ) ?? true )
95
+
91
96
const isPressed = ref ( toValue ( keyFilter ) === true )
92
97
93
98
let modifierPressed = false
@@ -124,7 +129,12 @@ export function useKeyPress(keyFilter: MaybeRefOrGetter<KeyFilter | boolean | nu
124
129
return
125
130
}
126
131
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
+ }
128
138
129
139
isPressed . value = true
130
140
} ,
0 commit comments