提问人:Jean-Philippe Pellet 提问时间:4/19/2023 更新时间:11/18/2023 访问量:150
确定鼠标按下是否会触发 JS 中的上下文菜单
Determine if a mousedown will trigger contextmenu in JS
问:
我想处理事件,但不是那些稍后会立即触发事件的事件。mousedown
contextmenu
由于事件是在事件之前调度的,因此我无法以某种方式“标记”事件(例如,通过记录其 )在处理程序中。mousedown
contextmenu
timeStamp
contextmenu
当然,我可以签入处理程序,但这错过了触发上下文菜单的其他一些方式(以及我假设的平台特定细节)。那么,我如何确定是否会随之而来呢?event.ctrlKey
mousedown
contextmenu
答:
你是对的,有不同的方法可以触发上下文菜单
事件,但是正如你所描述的那样,这个问题归结为“mousedown
and ”的情况。contextmenu
通常,当按下鼠标辅助按钮时,将发生一个事件。Mac的特例,我们稍后将讨论。contextmenu
mousedown
铌:当未进行其他配置时,辅助按钮通常是右侧按钮。例如,左撇子会更喜欢鼠标左键。但是,这在这里并不重要,因此让我们坚持使用与配置无关的术语辅助按钮。
现在,您可以在处理程序中检查已按下的按钮,查询 MouseEvent 对象的按钮属性
。辅助按钮由数字 表示。因此,如果在处理程序中,请不要执行要跳过的内容,以防触发事件。mousedown
2
MouseEvent.button == 2
mousedown
contextmenu
此外,在Apple设备上,还可以在按下Control键的同时使用主要鼠标按钮,即通常但不一定是左键。因此,处理程序中对对象的完整检查是:mousedown
MouseEvent
e
e.button == 2 || (e.button == 0 && e.ctrlKey)
如果是,事件将(右键单击)或可能(左键单击 + ctrl)跟随。在 Windows 和 Linux 上,使用 Control 左键单击会被误解为 之后的事件。要么希望在 Windows 或 Linux 上没有人想到这个想法,要么抓住这种情况。true
contextmenu
click
mouseup
这应该涵盖常见操作系统(即 Windows、Linux 和 Mac)上所有与鼠标相关的触发器。contextmenu
正如 aarvinr 在他的评论中指出的那样,也可以使用 MouseEvent.buttons
属性来实现此目的。
评论
MouseEvent.buttons
来检查在单击过程中是否按住了任何其他键 - 类似于 ,但对于其他平台来说更通用。MouseEvent.ctrlKey
click
mouseup
评论
mousedown
contextmenu
contextmenu
mousedown
mousedown
contextmenu
mousedown