注册快捷键(单快捷键、组合快捷键)

34 篇文章 2 订阅
19 篇文章 0 订阅

一、注册快捷键方法

window.addEventListener('keydown', onWindowKeyDown, false);
window.addEventListener('keyup', onWindowKeyUp, false);

注意:addEventListener在组建销毁的时候也需要销毁

eg:react+hooks

  useEffect(() => {
    window.addEventListener('keydown', onWindowKeyDown, false);
    window.addEventListener('keyup', onWindowKeyUp, false);
    return (() => {
      window.removeEventListener('keydown', onWindowKeyDown, false);
      window.removeEventListener('keyup', onWindowKeyUp, false);
    })
  }, [])

二、区分mac和windows快捷键

1、从UA中获取相关数据来判定是mac系统

let isMac = /Mac OS X/ig.test(navigator.userAgent);

2、mac和windows组合键和单快捷键操作

@see:

isMac: 判断是否是mac电脑

evt: 系统事件对象,如果使用了typescript,参数可以设置成evt: KeyboardEvent

evt.metaKey: 准备使用组合键,按下了metaKey,distinguishKeyBoardEvent方法下面讲

!evt.metaKey: 不使用快捷键,单键直接触发快捷功能

如果是windows,同理换成evt.ctrlKey,如下

function onWindowKeyDown (evt) {
    if (isMac) {
       if (evt.metaKey) {
            distinguishKeyBoardEvent(evt);
       }
       if (!evt.metaKey) publicKeyboardShortcuts(evt); //单快捷键操作
    } else {
       if (evt.ctrlKey) {
            distinguishKeyBoardEvent(evt);
       }
       if (!evt.ctrlKey) publicKeyboardShortcuts(evt);
    }
}

3、上面的组合键  distinguishKeyBoardEvent 方法定义

注:下面function(){ //doSomething } 是按下快捷键之后的主要逻辑

function distinguishKeyBoardEvent (evt) {
    const actions = new Map([
      [{keyCode: 'z'}, () => function(){//doSomething}],
      [{keyCode: 'y'}, () => function(){//doSomething}],
    ]);
    let action = [...actions].filter(([key, value]) => (key.keyCode == evt.key));
    action.forEach(([key, value]) => {
      value.call(window); //执行方法function(){//doSomething}
      evt.stopPropagation();
      evt.cancelBubble = true
    });
}

4、上面的单快捷键 publicKeyboardShortcuts 方法定义

注:下面doing(){ } 是按下快捷键之后的主要逻辑

function publicKeyboardShortcuts (evt) {
    const actions = new Map([
      [{keyCode: 'p'}, () => doing()],
      [{keyCode: 'c'}, () => doing()],
      [{keyCode: 't'}, () => doing()],
      [{keyCode: 's'}, () => doing()],
      [{keyCode: 'e'}, () => doing()],
      [{keyCode: 'v'}, () => doing()],
      [{keyCode: 'q'}, () => doing()],
    ]);
    let action = [...actions].filter(([key, value]) => (key.keyCode == evt.key));
    action.forEach(([key, value]) => value.call(window)); //执行doing方法
}

function doing() {
    //doSomething
}

注意:如果有单快捷键,这时候要注意输入框,如果需要在输入框中书写内容,就不能触发快捷键操作,如下可以return掉

if (["INPUT", "TEXTAREA"].includes((evt.target as HTMLElement).nodeName)) return;

交流


1、QQ群:可添加qq群共同进阶学习: 进军全栈工程师疑难解  群号:   856402057

2、公众号:公众号「进军全栈攻城狮」 ,对前端技术保持学习爱好者。我会经常分享自己所学所看的干货,在进阶的路上,共勉!

学习之余,不要忘记吃饭了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值