了解consumeRollupEvent

时间:2014-07-09 23:15:12

标签: javascript firefox-addon mouseevent

我有一个附加组件,当用户按住鼠标右键时,他们可以滚动滚轮,它会改变标签。

现在在Windows中,如果用户按下右键,则不会打开上下文菜单。在linux中,它会在鼠标按下时打开上下文菜单。

DOMMouseScroll事件列表器位于chrome窗口,即:window.addEventListener('DOMMouseScroll', func, true)

因此,如果您复制此代码并将其粘贴到scratchapd:

window.addEventListener('DOMMouseScroll', function() {
  window.removeEventListener('DOMMouseScroll', arguments.callee, true);
  console.log('scroll caught and removed')
}, true)

然后转到浏览器窗口,右键单击打开上下文菜单,并在鼠标悬停在上下文菜单上滚动,在窗口中,滚动被捕获。在linux中它不是。 (这里很奇怪:如果监听器在窗口上添加并且单击位于上下文菜单中,则会捕获mousedown事件。)

我认为将消费汇总事件设置为不消耗会解决它。但事实并非如此。

有关如何解决此问题以及consumeRollupEvent的任何想法都有影响吗?

目前我在上下文菜单的popupshowing事件中将使用汇总事件设置为false:

noConsume: function(event)  {
    if (event.target != document.getElementById('contentAreaContextMenu')) { return }
    if (event.target.popupBoxObject)    {
        //event.target.popupBoxObject.setConsumeRollupEvent(Components.interfaces.nsIPopupBoxObject.ROLLUP_NO_CONSUME); //no longer support setConsumeRollupEvent
    }
        event.target.setAttribute('consumeoutsideclicks', false);
        event.target.consumeoutsideclicks = false;
},

现在我怀疑DOMMouseScroll事件没有被捕获,所以我将其更改为addEventListner('wheel'...并发送用户测试插件,等待他的话回来了。

1 个答案:

答案 0 :(得分:2)

我认为setConsumeRollupEvent不会帮助您拦截滚动事件。它指的是上下文菜单的卷起(即导致上下文菜单关闭的事件);与鼠标滚轮无关。

https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XUL/Method/setConsumeRollupEvent

值得关注的是Windows和Linux之间存在行为差异的原因。它可能是一个Firefox错误,或者至少它可能会给你一个解决它的最佳方法的线索。也许有一种方法可以阻止在Linux上的MouseDown上调用上下文菜单,听起来这对你的插件来说是最理想的结果。