Shfit 多选功能之热键冲突 Issue

最近给我们的 Plait 框架支持了 Shfit 选择图形的功能,以前的框选只能选择相邻的图形,支持完 Shfit 选择后就可以隔着图形选择了,如下所示:

在做这个需求是的时候最开始是这么写的(代码片段):

ini 复制代码
board.keydown = (event: KeyboardEvent) => {
  if (!isShift && event.key === 'Shift') {
    isShift = true;
  }
  keydown(event);
}

board.keyup = (event: KeyboardEvent) => {
  if (isShift && event.key === 'Shift') {
    isShift = false;
  }
  keyup(event);
};

监控 keydown 和 keyup 维护一个 isShfit 状态,这个思路也很常见。

这个写法有一些问题,就是有时会出现 isShift 状态不正确,明明 shift 键已经 up 了,但是 isShfit 却没有更新为 false,还是不稳定复现。

我自己也遇到了这个问题,最终根据场景找到了原因,是因为热键冲突,当我按 Shift+Common+5 触发我本机的截图热键后,浏览器就不触发 keyup 事件了,所以导致 isShfit 状态错误。

方案更正

不再使用 keydown、keyup 维护 isShfit 状态,而是基于鼠标事件维护 isShfit 状态(通常 isShfit 状态的使用都在鼠标事件之后):

ini 复制代码
if (!isShift && event.shiftKey) {
  isShift = true;
}
if (isShift && !event.shiftKey) {
  isShift = false;
}

代码仓储:github.com/worktile/pl...

功能体验:plait-gamma.vercel.app/?init=draw

相关推荐
hh随便起个名4 小时前
力扣二叉树的三种遍历
javascript·数据结构·算法·leetcode
我是小路路呀5 小时前
element级联选择器:已选中一个二级节点,随后又点击了一个一级节点(仅浏览,未确认选择),此时下拉框失去焦点并关闭
javascript·vue.js·elementui
程序员爱钓鱼5 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
PineappleCoder5 小时前
工程化必备!SVG 雪碧图的最佳实践:ID 引用 + 缓存友好,无需手动算坐标
前端·性能优化
JIngJaneIL6 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
敲敲了个代码6 小时前
隐式类型转换:哈基米 == 猫 ? true :false
开发语言·前端·javascript·学习·面试·web
澄江静如练_6 小时前
列表渲染(v-for)
前端·javascript·vue.js
JustHappy6 小时前
「chrome extensions🛠️」我写了一个超级简单的浏览器插件Vue开发模板
前端·javascript·github
Loo国昌6 小时前
Vue 3 前端工程化:架构、核心原理与生产实践
前端·vue.js·架构