Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/KeyCode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,27 @@ const KeyCode = {
return false;
}
},

isEditableTarget: function isEditableTarget(e: KeyboardEvent) {
Comment thread
aojunhao123 marked this conversation as resolved.
const target = e.target;

if (!(target instanceof HTMLElement)) {
return false;
}

const tagName = target.tagName;
if (
e.isComposing ||
Comment thread
aojunhao123 marked this conversation as resolved.
Outdated
tagName === 'INPUT' ||
tagName === 'TEXTAREA' ||
tagName === 'SELECT' ||
target.isContentEditable
) {
return true;
}

return false;
Comment on lines +529 to +538
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This conditional block can be simplified into a single return statement. This improves conciseness without sacrificing readability.

    return (
      e.isComposing ||
      tagName === 'INPUT' ||
      tagName === 'TEXTAREA' ||
      tagName === 'SELECT' ||
      target.isContentEditable
    );

},
};

export default KeyCode;
54 changes: 54 additions & 0 deletions tests/KeyCode.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import KeyCode from '../src/KeyCode';

describe('KeyCode.isEditableTarget', () => {
function testIsEditableTarget(
listenTarget: EventTarget,
dispatchTarget: EventTarget,
init?: KeyboardEventInit,
) {
let result: boolean | undefined;

const handler = (e: KeyboardEvent) => {
result = KeyCode.isEditableTarget(e);
};

listenTarget.addEventListener('keydown', handler);
dispatchTarget.dispatchEvent(new KeyboardEvent('keydown', init));
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

testinglib 有创建 event 的函数,直接写一个 element 再 createEvent 就行了,测试不用太散,直接写一个 lement 数组,遍历测试就行:

const eleList = [
{
  element: 'div',
  isContentEditable: true,
  expect: true,
},
...
];

另外 IME composing 这个不用测,因为你代码里也没写

listenTarget.removeEventListener('keydown', handler);

return result;
}

it('check non-editable target', () => {
const result = testIsEditableTarget(window, window);

expect(result).toBe(false);
});

it('IME composing', () => {
const input = document.createElement('input');
const result = testIsEditableTarget(input, input, { isComposing: true });

expect(result).toBe(true);
});

it('check input target', () => {
const input = document.createElement('input');
document.body.appendChild(input);

const result = testIsEditableTarget(window, input, { bubbles: true });

document.body.removeChild(input);

expect(result).toBe(true);
});

it('check contentEditable target', () => {
const editable = document.createElement('div');
// mock isContentEditable cause JSDOM don't support it
Object.defineProperty(editable, 'isContentEditable', { value: true });
const result = testIsEditableTarget(editable, editable);

expect(result).toBe(true);
});
});
Loading