应使用位运算判断多键状态:左键(1)、右键(2)、中键(4)等对应2的幂次,通过 event.buttons & 1、& 2 等检测单键,再用逻辑与组合多键;不可用 === 判断组合值,因其无法排除其他键干扰。
直接用 event.buttons & 数值 判断各键是否按下,再组合逻辑条件,就能准确识别左键+右键、左键+中键等多键同时点击状态。
buttons 的编码规则要记牢
它不是简单相加,而是位掩码:每个按钮对应一个 2 的幂次值:
- 1 → 左键(二进制 001)
- 2 → 右键(二进制 010)
- 4 → 中键(滚轮点击,二进制 100)
- 8 → 第四键(如浏览器后退侧键)
- 16 → 第五键(如浏览器前进侧键)
多个键同时按下时,数值是对应值的按位或(|)。比如左键+右键是 1 | 2 = 3,左键+中键是 1 | 4 = 5,三键全按是 1 | 2 | 4 = 7。
为什么不能用 === 判断组合?
因为 event.buttons === 3 看似能匹配“左键+右键”,但一旦用户同时按下了第四键(值为 8),实际值就变成 3 | 8 = 11,这个判断就会失效。它只在“恰好只有这两个键按下”时才成立,而现实场景中无法保证。
正确做法是分别检测每一位:
-
✅ 左键是否按下:
event.buttons & 1(结果非 0 即为真) -
✅ 右键是否按下:
event.buttons & 2 -
✅ 左键和右键同时按下:
(event.buttons & 1) && (event.buttons & 2) -
✅ 左键+中键:
(event.buttons & 1) && (event.buttons & 4) -
✅ 右键+中键:
(event.buttons & 2) && (event.buttons & 4)
推荐封装成可复用函数
避免每次手写冗长判断,可以定义清晰语义的工具函数:
isLeftDown(e) { return e.buttons & 1; }isRightDown(e) { return e.buttons & 2; }isMiddleDown(e) { return e.buttons & 4; }isLeftAndRight(e) { return isLeftDown(e) && isRightDown(e); }isLeftAndMiddle(e) { return isLeftDown(e) && isMiddleDown(e); }
这样在 mousedown 或 mousemove 事件中调用更直观,也方便后续扩展支持第四、第五键。
注意 event.button 和 event.buttons 的区别
event.button 表示“触发本次事件的是哪个键”(比如 mousedown 时点的是左键,button 就是 0);
event.buttons 表示“此刻所有仍处于按下状态的键的组合”(哪怕你正在拖动鼠标,只要左键没松开,buttons 就一直含 1)。
所以想响应“拖拽中右键按下”这类行为,必须依赖 buttons;仅靠 button 会漏掉中间状态。










