firefox插件-Linux/Ubuntu:Wheel事件在上下文菜单打开时不会触发



这是我正在运行的代码:

  window.removeEventListener('wheel', onwheel, false);
  window.removeEventListener('mousedown', ondown, false);
  function onwheel(e) {
    console.info('wheeled, e:', e);
  }
  function ondown(e) {
    console.info('downed, e:', e);
  }
  window.addEventListener('wheel', onwheel, false);
  window.addEventListener('mousedown', ondown, false);

如果我在浏览器窗口上滚动轮子,轮子事件就会触发。然而,我的意图是只在按住鼠标右键时检测轮子事件。

问题是,按住鼠标右键会打开上下文菜单面板,这是很好的,也是意料之中的,但现在轮子事件不会触发,除非我的鼠标在打开的上下文菜单上。有人知道怎么解决这个问题吗?

即使上下文菜单可见,这种行为也不会在Windows系统上发生(旁注:在Windows上,上下文菜单直到鼠标抬起才显示,但我强迫它显示以测试这一点,即使我的鼠标不在上下文菜单上,也会触发轮子事件)。

UI问题:

你描述的UI听起来有点违背了大多数人的期望。使用双指鼠标按钮+滚轮组合是不寻常的。用户非常熟悉使用ALTCTRLShift作为按钮和鼠标操作的修饰符。您将两个已经使用过的UI控件(滚轮和右键单击)组合在一起的方式让用户感到困惑。此外,它还试图覆盖这两个控件的现有操作。在我看来,最好使用Shift-滚轮,因为这没有默认操作CTRL-滚轮的默认操作是缩放,ALT-滚轮使UI处于下一个键盘输入被视为菜单选择的状态。

哪个window

你没有说:这个代码运行的上下文是什么?这是一个框架脚本吗?或者更明确地说,您使用哪个window来设置侦听器?您使用的是文档window、选项卡window还是整体浏览器window?你确定你正在使用的操作系统在所有操作系统类型上都是一样的吗?我希望,如果您使用整体浏览器window,您应该获得所有事件,即使是那些鼠标不在上下文菜单上的事件。如果您正在使用其中一个,那么只在模式上下文菜单集中时接收事件并不是没有道理的。如果您没有具体获得整体浏览器window,那么您正在使用的window可能是其他浏览器之一。

阻止上下文菜单在mousedown上显示:

对此,一个简单的解决方案应该是防止上下文菜单在mousedown时打开。任一Event.preventDefault():

function ondown(e) {
    e.preventDefault();
    console.info('downed, e:', e);
}

Event.stopPropagation():

function ondown(e) {
    e.stopPropagation();
    console.info('downed, e:', e);
}

应防止上下文菜单在CCD_ 13事件上显示。假设它不是基于另一个事件显示的,则此代码将阻止它被显示。事实上,假设此代码不检查哪个鼠标按钮或按钮的任何可能的修饰符,它将在所有mousedown事件上stopPropagation()preventDefault(),这在现实世界的代码中是不可取的。换言之,这是一个非常简单的例子,你可以扩展它,这样你只会篡夺你实际目标的事件。

最新更新