有时候需要监听某个按键来执行操作,比如监听 r 键的按下来执行确定的逻辑。如果对某个div进行监听,就会有焦点问题,因此最好是给 document 增加 keydown 事件。但是监听按键时不能影响现在的输入逻辑,比如在 input 中输入文字时,也会触发按键事件,所以需要对 event.target 做一定的筛选,符合条件的才能看做是快捷键事件。

    1. export const isTargetInput = e => {
    2. console.log(e.target);
    3. return ['INPUT', 'TEXTAREA'].includes(e.target.tagName)
    4. && !['checkbox', 'button', 'file', 'hidden', 'image', 'radio',
    5. 'range', 'reset', 'submit' ].includes(e.target.type);
    6. };
    7. // 增加 keydown 监听事件
    8. export function addKeydownHandler(callback) {
    9. const handler = event => {
    10. if (!isTargetInput(event)) {
    11. callback(event);
    12. event.stopPropagation();
    13. }
    14. };
    15. document.addEventListener('keydown', handler);
    16. this.$on('hook:beforeDestroy', () => {
    17. document.removeEventListener('keydown', handler);
    18. });
    19. }