buttons 是 MouseEvent 的只读整数,用位掩码表示鼠标按钮按下状态:1(左键)、2(右键)、4(中键)、8(第四键)、16(第五键);多键同时按下时值为对应数值的按位或,判断组合需用按位与(&)检测,不可用全等(===)。

buttons 属性是 MouseEvent 的只读整数,表示当前**按下的鼠标按钮状态**(不包括键盘按键),它用位掩码(bitmask)方式编码,每个按钮对应一个二进制位。要判断多个鼠标键是否**同时按下**(比如左键 + 右键、左键 + 中键等),不能用 === 等于某个值来简单匹配,而应使用**按位与(&)** 检查特定位是否为 1。
理解 buttons 的位编码规则
标准定义如下(主流浏览器一致):
-
1(二进制
001)→ 左键(primary button) -
2(二进制
010)→ 右键(secondary button) -
4(二进制
100)→ 中键(auxiliary button,如滚轮点击) -
8(二进制
1000)→ 第四按钮(如浏览器前进/后退侧键,非所有设备支持) -
16(二进制
10000)→ 第五按钮
多个键同时按下时,buttons 值是对应数值的**按位或(|)结果**。例如:左键+右键 → 1 | 2 = 3;左键+中键 → 1 | 4 = 5;三键全按 → 1 | 2 | 4 = 7。
正确判断多键组合的方法
用 & 运算符分别检测各键是否处于按下状态,避免误判:
- ✅ 正确:
event.buttons & 1→ 左键是否按下(结果非 0 即真) - ✅ 正确:
event.buttons & 2→ 右键是否按下 - ✅ 正确:
(event.buttons & 1) && (event.buttons & 2)→ 左键和右键**同时按下** - ❌ 错误:
event.buttons === 3→ 虽然 3 表示左+右,但若此时还有其他键(如第 4 键)也按下,buttons可能是3 | 8 = 11,该判断就会漏掉
常用组合的检测写法(推荐封装为函数)
可复用的逻辑示例:
- 左键 + 右键:
(e.buttons & 1) && (e.buttons & 2) - 左键 + 中键:
(e.buttons & 1) && (e.buttons & 4) - 右键 + 中键:
(e.buttons & 2) && (e.buttons & 4) - 三键全按:
(e.buttons & 1) && (e.buttons & 2) && (e.buttons & 4) - 仅左键(无其他键):
e.buttons === 1或(e.buttons & 1) && !(e.buttons & ~1)(更严谨)
注意兼容性与实际限制
并非所有组合都能被所有设备/系统触发:
- 多数 Windows/Linux 驱动默认**不支持左键+右键同时按下触发事件**(系统可能直接弹出上下文菜单,中断原生
mousemove流) - macOS 触控板/妙控鼠标对多键模拟有限制,需外接多键鼠标测试
-
buttons在mousedown/mouseup/mousemove中可用,但click和contextmenu中通常已释放,值为 0 - 部分旧版 IE 使用
button属性(单值),不支持多键,buttons是 IE9+ 和现代浏览器的标准

















