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

相关推荐
Mintopia6 分钟前
🚀 一文看懂 “Next.js 全栈 + 微服务 + GraphQL” 的整体样貌
前端·javascript·全栈
Mintopia8 分钟前
🧬 医疗Web场景下,AIGC的辅助诊断技术边界与伦理
前端·javascript·aigc
半桶水专家13 分钟前
父子组件通信详解
开发语言·前端·javascript
Watermelo61715 分钟前
从vw/h到clamp(),前端响应式设计的痛点与进化
前端·javascript·css·算法·css3·用户界面·用户体验
寻星探路20 分钟前
测试开发话题10---自动化测试常用函数(2)
java·前端·python
Moment21 分钟前
快到  2026  年了:为什么我们还在争论  CSS 和 Tailwind?
前端·javascript·css
梵得儿SHI33 分钟前
Vue 核心语法详解:模板语法中的绑定表达式与过滤器(附 Vue3 替代方案)
前端·javascript·vue.js·插值语法·vue模板语法·绑定表达式·过滤器机制
江城开朗的豌豆35 分钟前
TypeScript枚举:让你的代码更有"选择权"
前端·javascript
江城开朗的豌豆1 小时前
TypeScript接口:打造你的代码“契约”之道
前端·javascript
江城开朗的豌豆1 小时前
TypeScript类:面向对象编程的超级武器
前端·javascript