确定鼠标按下是否会触发 JS 中的上下文菜单

Determine if a mousedown will trigger contextmenu in JS

提问人:Jean-Philippe Pellet 提问时间:4/19/2023 更新时间:11/18/2023 访问量:150

问:

我想处理事件,但不是那些稍后会立即触发事件的事件。mousedowncontextmenu

由于事件是在事件之前调度的,因此我无法以某种方式“标记”事件(例如,通过记录其 )在处理程序中。mousedowncontextmenutimeStampcontextmenu

当然,我可以签入处理程序,但这错过了触发上下文菜单的其他一些方式(以及我假设的平台特定细节)。那么,我如何确定是否会随之而来呢?event.ctrlKeymousedowncontextmenu

JavaScript 事件处理 上下文菜单

评论

0赞 Krokomot 11/15/2023
可以肯定的是,你关于如何确定一个事件是否被一个事件继承的问题,等同于如何确定一个事件之前是否被一个事件所取代的问题,对吧?mousedowncontextmenucontextmenumousedown
0赞 Jean-Philippe Pellet 11/15/2023
@Krokomot不完全是,因为如果没有的话,我也想做一些事情。实际上,这是我主要关心的问题:如果这实际上是一个上下文菜单触发器,请找到一种方法来不做我的正常事情。mousedowncontextmenumousedown
0赞 Bergi 11/16/2023
@Jean-PhilippePellet 您(有时)想在鼠标下移处理程序中做什么?有没有机会推迟一点?
0赞 Jean-Philippe Pellet 11/17/2023
@Bergi它开始移动项目或选择它们。如果可以的话,我想避免耽误任何事情。
0赞 Bergi 11/18/2023
@Jean-PhilippePellet:你的意思是像拖拽动作?这只能通过主按钮完成。

答:

2赞 Krokomot 11/16/2023 #1

你是对的,有不同的方法可以触发上下文菜单事件,但是正如你所描述的那样,这个问题归结为“mousedown and ”的情况。contextmenu

通常,当按下鼠标辅助按钮时,将发生一个事件。Mac的特例,我们稍后将讨论。contextmenumousedown


铌:当未进行其他配置时,辅助按钮通常是右侧按钮。例如,左撇子会更喜欢鼠标左键。但是,这在这里并不重要,因此让我们坚持使用与配置无关的术语辅助按钮


现在,您可以在处理程序中检查已按下的按钮,查询 MouseEvent 对象的按钮属性。辅助按钮由数字 表示。因此,如果在处理程序中,请不要执行要跳过的内容,以防触发事件。mousedown2MouseEvent.button == 2mousedowncontextmenu

此外,在Apple设备上,还可以在按下Control键的同时使用主要鼠标按钮,即通常但不一定是左键。因此,处理程序中对对象的完整检查是:mousedownMouseEvente

e.button == 2 || (e.button == 0 && e.ctrlKey)

如果是,事件将(右键单击)或可能(左键单击 + ctrl)跟随。在 Windows 和 Linux 上,使用 Control 左键单击会被误解为 之后的事件。要么希望在 Windows 或 Linux 上没有人想到这个想法,要么抓住这种情况。truecontextmenuclickmouseup

这应该涵盖常见操作系统(即 Windows、Linux 和 Mac)上所有与鼠标相关的触发器。contextmenu


正如 aarvinr 在他的评论中指出的那样,也可以使用 MouseEvent.buttons 属性来实现此目的。

评论

1赞 aarvinr 11/16/2023
您还可以使用 MouseEvent.buttons 来检查在单击过程中是否按住了任何其他键 - 类似于 ,但对于其他平台来说更通用。MouseEvent.ctrlKey
0赞 Krokomot 11/16/2023
真。将其添加到答案中。感谢。
0赞 Jean-Philippe Pellet 11/17/2023
好吧,这在某种程度上是有效的,这就是我现在正在做的事情。但它仍然是一些逆向工程,它可能会对某些系统设置或平台产生误报或漏报,我假设......
0赞 Krokomot 11/18/2023
更新以涵盖 Mac。
0赞 Krokomot 11/18/2023
简而言之,“通过鼠标进行上下文菜单”场景由两种情况组成。仅在 Windows/Linux/Max 上为“鼠标辅助按钮按下”,在 Mac 上为“鼠标主按钮按下加 Control”。后者在 Windows/Linux 上会引发误报,因为它将被解释为 之后的事件。这是您必须抓住的唯一边缘情况。记住 -- 你不能对这个世界上任何异国情调的平台或系统设置负责。顺便说一句,左撇子不受影响,因为它是主/辅助按钮,而不是左/右按钮。clickmouseup