@@ -41,35 +41,58 @@ export const hotkeysMap = createRootMemo(() =>
4141 ) ,
4242) ;
4343
44+ const actionsMap : Record <
45+ 'bubble' | 'capture' ,
46+ Record < string , ( e : KeyboardEvent ) => unknown > | null
47+ > = { bubble : null , capture : null } ;
48+
49+ const createKeydownHandler =
50+ ( type : 'bubble' | 'capture' ) => ( e : KeyboardEvent ) => {
51+ const actions = actionsMap [ type ] ;
52+ if ( ! actions ) return ;
53+
54+ // 跳过输入框的键盘事件
55+ switch ( ( e . target as HTMLElement ) . tagName ) {
56+ case 'INPUT' :
57+ case 'TEXTAREA' :
58+ return ;
59+ }
60+ if ( ( e . target as HTMLElement ) . isContentEditable ) return ;
61+
62+ if ( Reflect . has ( actions , e . key ) && actions [ e . key ] ( e ) !== 1 ) {
63+ e . stopPropagation ( ) ;
64+ e . preventDefault ( ) ;
65+ e . stopImmediatePropagation ( ) ;
66+ }
67+
68+ const hotkeyName = hotkeysMap ( ) [ getKeyboardCode ( e ) ] ;
69+ if ( Reflect . has ( actions , hotkeyName ) && actions [ hotkeyName ] ( e ) !== 1 ) {
70+ e . stopPropagation ( ) ;
71+ e . preventDefault ( ) ;
72+ e . stopImmediatePropagation ( ) ;
73+ }
74+ } ;
75+
76+ const handlers = {
77+ bubble : createKeydownHandler ( 'bubble' ) ,
78+ capture : createKeydownHandler ( 'capture' ) ,
79+ } ;
80+
4481/** 监听快捷键 */
4582export const listenHotkey = (
4683 actions : Record < string , ( e : KeyboardEvent ) => unknown > ,
4784 capture ?: boolean ,
48- ) => {
49- window . addEventListener (
50- 'keydown' ,
51- ( e ) => {
52- // 跳过输入框的键盘事件
53- switch ( ( e . target as HTMLElement ) . tagName ) {
54- case 'INPUT' :
55- case 'TEXTAREA' :
56- return ;
57- }
58- if ( ( e . target as HTMLElement ) . isContentEditable ) return ;
85+ ) : ( ( ) => void ) => {
86+ const type = capture ? 'capture' : 'bubble' ;
5987
60- if ( Reflect . has ( actions , e . key ) && actions [ e . key ] ( e ) !== 1 ) {
61- e . stopPropagation ( ) ;
62- e . preventDefault ( ) ;
63- e . stopImmediatePropagation ( ) ;
64- }
88+ if ( actionsMap [ type ] ) Object . assign ( actionsMap [ type ] , actions ) ;
89+ else {
90+ actionsMap [ type ] = { ... actions } ;
91+ window . addEventListener ( 'keydown' , handlers [ type ] , { capture } ) ;
92+ }
6593
66- const hotkeyName = hotkeysMap ( ) [ getKeyboardCode ( e ) ] ;
67- if ( Reflect . has ( actions , hotkeyName ) && actions [ hotkeyName ] ( e ) !== 1 ) {
68- e . stopPropagation ( ) ;
69- e . preventDefault ( ) ;
70- e . stopImmediatePropagation ( ) ;
71- }
72- } ,
73- { capture } ,
74- ) ;
94+ return ( ) => {
95+ window . removeEventListener ( 'keydown' , handlers [ type ] , { capture } ) ;
96+ actionsMap [ type ] = null ;
97+ } ;
7598} ;
0 commit comments