@@ -47,20 +47,7 @@ export function bindContainerDomListener(eventManager: EventManager) {
4747 } ) ;
4848
4949 // 监听键盘事件
50- handler . on ( document . body , 'keydown' , ( e : KeyboardEvent ) => {
51- const selectedRanges = table . stateManager . select . ranges ;
52- const justOneCellSelected =
53- selectedRanges . length === 1 &&
54- selectedRanges [ 0 ] . start . col === selectedRanges [ 0 ] . end . col &&
55- selectedRanges [ 0 ] . start . row === selectedRanges [ 0 ] . end . row ;
56- const editor =
57- justOneCellSelected &&
58- ( table as ListTableAPI ) . getEditor ( table . stateManager . select . cellPos . col , table . stateManager . select . cellPos . row ) ;
59- const editorInput = editor ?. getInputElement ?.( ) ;
60-
61- if ( e . target !== table . getElement ( ) && e . target !== editorInput ) {
62- return ;
63- }
50+ handler . on ( table . getElement ( ) , 'keydown' , ( e : KeyboardEvent ) => {
6451 // 键盘按下事件 内部逻辑处理前
6552 const beforeKeydownEvent : KeydownEvent = {
6653 keyCode : e . keyCode ?? e . which ,
@@ -149,15 +136,14 @@ export function bindContainerDomListener(eventManager: EventManager) {
149136 if ( isCellDisableSelect ( table , targetCol , targetRow ) ) {
150137 return ;
151138 }
139+ const isEditingCell = ! ! ( table as ListTableAPI ) . editorManager ?. editingEditor ;
140+ // 下面这句completeEdit代码和selectCell代码顺序很重要,不能颠倒,否则会导致编辑器失去焦点(selectCell会触发到edit-manager的selected_changed事件,getEditor会创建editor实例并缓存,completeEdit会清空缓存)
141+ ( table as ListTableAPI ) . editorManager ?. completeEdit ( ) ;
142+ table . getElement ( ) . focus ( ) ;
152143 const enableShiftSelectMode = table . options . keyboardOptions ?. shiftMultiSelect ?? true ;
153144 table . selectCell ( targetCol , targetRow , e . shiftKey && enableShiftSelectMode ) ;
154- if (
155- ( table . options . keyboardOptions ?. moveEditCellOnArrowKeys ?? false ) &&
156- ( table as ListTableAPI ) . editorManager ?. editingEditor
157- ) {
145+ if ( ( table . options . keyboardOptions ?. moveEditCellOnArrowKeys ?? false ) && isEditingCell ) {
158146 // 开启了方向键切换编辑单元格 并且当前已经在编辑状态下 切换到下一个需先退出再进入下个单元格的编辑
159- ( table as ListTableAPI ) . editorManager ?. completeEdit ( ) ;
160- table . getElement ( ) . focus ( ) ;
161147 if ( ( table as ListTableAPI ) . getEditor ( targetCol , targetRow ) ) {
162148 ( table as ListTableAPI ) . editorManager ?. startEditCell ( targetCol , targetRow ) ;
163149 }
@@ -238,10 +224,12 @@ export function bindContainerDomListener(eventManager: EventManager) {
238224 if ( isCellDisableSelect ( table , targetCol , targetRow ) ) {
239225 return ;
240226 }
227+ const isEditingCell = ! ! ( table as ListTableAPI ) . editorManager ?. editingEditor ;
228+ // 下面这句completeEdit代码和selectCell代码顺序很重要,不能颠倒,否则会导致编辑器失去焦点(selectCell会触发到edit-manager的selected_changed事件,getEditor会创建editor实例并缓存,completeEdit会清空缓存)
229+ ( table as ListTableAPI ) . editorManager ?. completeEdit ( ) ;
230+ table . getElement ( ) . focus ( ) ;
241231 table . selectCell ( targetCol , targetRow ) ;
242- if ( ( table as ListTableAPI ) . editorManager ?. editingEditor ) {
243- ( table as ListTableAPI ) . editorManager ?. completeEdit ( ) ;
244- table . getElement ( ) . focus ( ) ;
232+ if ( isEditingCell ) {
245233 if ( ( table as ListTableAPI ) . getEditor ( targetCol , targetRow ) ) {
246234 ( table as ListTableAPI ) . editorManager ?. startEditCell ( targetCol , targetRow ) ;
247235 }
@@ -250,6 +238,11 @@ export function bindContainerDomListener(eventManager: EventManager) {
250238 }
251239 } else if ( ! ( e . ctrlKey || e . metaKey ) ) {
252240 const editCellTrigger = ( table . options as ListTableConstructorOptions ) . editCellTrigger ;
241+ const selectedRanges = table . stateManager . select . ranges ;
242+ const justOneCellSelected =
243+ selectedRanges . length === 1 &&
244+ selectedRanges [ 0 ] . start . col === selectedRanges [ 0 ] . end . col &&
245+ selectedRanges [ 0 ] . start . row === selectedRanges [ 0 ] . end . row ;
253246 if ( justOneCellSelected ) {
254247 if (
255248 ( editCellTrigger === 'keydown' || ( Array . isArray ( editCellTrigger ) && editCellTrigger . includes ( 'keydown' ) ) ) &&
0 commit comments