我有一个附加组件,当用户按住鼠标右键时,他们可以滚动滚轮,它会改变标签。
现在在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'...
并发送用户测试插件,等待他的话回来了。
答案 0 :(得分:2)
我认为setConsumeRollupEvent不会帮助您拦截滚动事件。它指的是上下文菜单的卷起(即导致上下文菜单关闭的事件);与鼠标滚轮无关。
https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XUL/Method/setConsumeRollupEvent
值得关注的是Windows和Linux之间存在行为差异的原因。它可能是一个Firefox错误,或者至少它可能会给你一个解决它的最佳方法的线索。也许有一种方法可以阻止在Linux上的MouseDown上调用上下文菜单,听起来这对你的插件来说是最理想的结果。