likes
comments
collection
share

超乎想象的快捷键魔法: 监听mousemove事件实现快捷键

作者站长头像
站长
· 阅读数 58

偶然的一次机会,发现了一个好玩的东西,不用监听keydown系列的事件,也可以实现快捷键功能。

现在有一个场景,需要同时按住 shift + alt,将鼠标样式变成小手(cursor: 'pointer'), 先看看 keydown 事件是如何实现的。

通过keydown事件

let originHotkey = []
let hotkeys = ['Shift', 'Alt'];
function isTracking() {
  return originHotkey.join() === hotkeys.join()
}
function handleKeydown (e) {
  if (hotkeys.includes(e.key)) {
    originHotkey.push(e.key);
  }
  if (isTracking()) {
    console.log('触发了快捷键');
    document.body.style.cursor = 'pointer'
  }
}
function handleKeyup(e) {
  if (hotkeys.includes(e.key)) {
    originHotkey = originHotkey.filter(hotkey => {
      return hotkey !== e.key
    })
  }
  if(!isTracking()) {
      document.body.style.cursor = 'auto'
  }
}
function handleClick () {
  if(isTracking()) {
    console.log("快捷键点击")
  }
}
window.addEventListener('keydown', handleKeydown);
window.addEventListener('keyup', handleKeyup);
window.addEventListener('click', handleClick);

大致思路就是维护一个 originHotkey 队列,每次键盘按下的时候,记录一下键盘的值,同时也检测一下,是否满足触发快捷键的要求。键盘松开的时候,删除队列里对应的值。

超乎想象的快捷键魔法: 监听mousemove事件实现快捷键

可以看到,每次我们按住 shift + alt 的时候,鼠标外观样式都会变成小手,松开快捷键时,又变回默认样式。

优缺点

优点很明显,可以捕获用户按下的所有键盘按键,包括字母、数字、功能键等,非常适合实现复杂组合的快捷键功能。

至于缺点的话,keydown 事件必须要在页面聚焦的时候,才会触发,如果当前焦点不在页面上,触发不了 keydown 事件。

举个🌰,打开控制台,切换到 consoletab,保证焦点在 console 上,如下

超乎想象的快捷键魔法: 监听mousemove事件实现快捷键

这个时候,我们再去触发快捷键,你会发现,压根就触发不了,无论你怎么按,鼠标也没有变成小手的状态,刷新一下页面,重复上述步骤,鼠标又可以正常变回小手样式了。

通过Event事件对象

在开始之前,先来看看 Event 对象上有哪些属性,写一个简单的🌰。

function handleMousemove(MouseEvent) {
  console.log('鼠标移动 MouseEvent: ', MouseEvent);
}
window.addEventListener('mousemove', handleMousemove);

超乎想象的快捷键魔法: 监听mousemove事件实现快捷键 仔细观察,可以看到,有一个 altKey 的属性,但是它的值是 false,让我们查一下mdn,看看这个值代表什么意思。

超乎想象的快捷键魔法: 监听mousemove事件实现快捷键

一目了然,似乎发现了另外一种实现快捷键的方法。还是基于上面那个场景,让我们用 mousemove 事件来实现一下。

let hotkey = ['shiftKey', 'altKey'];
function isTracking (e) {
  return hotkey.every(key => e[key]);
}
function handleMousemove(MouseEvent) {
  if(isTracking(MouseEvent)) {
    console.log('触发了快捷键')
    document.body.style.cursor = 'pointer'
  } else {
    document.body.style.cursor = 'auto'
  }
}
window.addEventListener('mousemove', handleMousemove);

超乎想象的快捷键魔法: 监听mousemove事件实现快捷键 你没看错,代码就是这么简单,而且再也不用担心页面有没有失焦了。

优缺点

优点很明显,代码简洁。

缺点的话,也很明显,MouseEvent 对象上,只支持四个键位,分别是shiftKeyaltKeymetaKeyctrlKey,不支持其他键盘,比如字母、数字、功能键等,自由度没有keydown事件高。

metaKey 在 MAC 键盘上,表示 Command 键(),在 Windows 键盘上,表示 Windows 键()。

altKey 在 MAC 键盘上,表示 option 键(),在 Windows 键盘上,表示 Windows 键(Alt)。

ctrlKey 在 MAC 键盘上,表示 control 键(^),在 Windows 键盘上,表示 Windows 键(Ctrl)。

总结

主要讲述了两种实现快捷键监听的方法:1.通过传统的keydown事件实现监听,自由度高,功能强大,但是页面失焦的时候,触发不了keydown事件;2.通过event对象的实例属性来实现监听,代码简洁,但是组合键有限,只支持四个键位shiftKeyaltKeymetaKeyctrlKey。大家可以根据不同场景,来选择合适的方案。

转载自:https://juejin.cn/post/7379980840796012563
评论
请登录