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

相关推荐
jingqingdai313 小时前
别用正则格式化 HTML!我用 DOM 遍历实现零风险本地格式化,老项目重构效率直接拉满
前端·重构·html
木斯佳13 小时前
前端八股文面经大全:腾讯前端实习二、三OC面(2026-04-27)·面经深度解析
前端·状态模式
Python私教13 小时前
如意Agent日志系统重构:从 print() 大海捞针到结构化可观测性栈
java·前端·重构
拉里呱唧13 小时前
一个像在使用PPT的在线 HTML 编辑器:HeyHTML
javascript·交互·html5
We་ct14 小时前
LeetCode 97. 交错字符串:动态规划详解
前端·算法·leetcode·typescript·动态规划
Chengbei1114 小时前
轻量化 Web 安全日志分析神器 星川智盾日志威胁检测、地理溯源、MITRE ATT&CK 映射,支持 Windows/macOS/Linux
前端·人工智能·安全·web安全·macos·系统安全·安全架构
风流 少年14 小时前
Python Web框架:FastAPI
前端·python·fastapi
GISer_Jing14 小时前
AI时代面试新常态——从“会用工具”到“深挖原理”的跨越
前端·人工智能·ai编程
IT_陈寒14 小时前
React的useEffect把我坑惨了,这些闭包陷阱真要命
前端·人工智能·后端