我有一个上下文菜单项,如果右键单击图像就会激活,与'context-copyimage'
被激活的方式完全相同。
是否可以将该menuitem绑定/配对'context-copyimage'
,因此无需添加额外(重复)事件监听器和显示/隐藏处理程序?? !!
(将观察者添加到'context-copyimage'
会失败目的)
如果没有,是否可以使用'context-copyimage'
使用的事件监听器?
更新:
我正在努力减少听众。目前,脚本有popupshowing
个侦听器。在popupshowing
上,它会检查gContextMenu.onImag
,如果为true,则会显示menuitem。 Firefox的context-copyimage
完全相同。我想知道是否可以绑定这两个以删除/减少脚本中的事件侦听器。
我也和Dagger聊天,他说:
......内置项目的状态不是从事件处理程序设置的,它是' s 从nsContextMenu的构造函数设置,没有 挂钩的机制
所以看来,这是不可能的
答案 0 :(得分:3)
不,没有理智的方法可以避免事件监听器比其他事件监听器更好地执行,并且与在会话中卸载加载项兼容。
nsContextMenu
正如您已经被告知的那样,状态是通过gContextMenu = new nsContextMenu(...)
初始化的。所以你需要挂钩的东西,实际上很容易。
var newProto = Object.create(nsContextMenu.prototype);
newProto.initMenuOriginal = nsContextMenu.prototype.initMenu;
newProto.initMenu = function() {
let rv = this.initMenuOriginal.apply(this, arguments);
console.log("ctx", this.onImage, this); // Or whatever code you'd like to run.
return rv;
};
nsContextMenu.prototype = newProto;
现在,第一个问题是:它实际上表现更好吗?毕竟这只是在原型链中引入了另一个链接。当然,可以避免Object.create
并直接覆盖nsContextMenu.prototype.initMenu
。
但真正的问题是:如何再次移除钩子?答:你真的不能,因为其他附加组件可能会在你之后挂钩同样的事情并且取消挂钩也会解开其他附加组件。但是你需要摆脱引用,否则加载项会在禁用/卸载时泄漏内存。好吧,你可以与Components.utils.makeObjectPropsNormal
战斗,但这对封闭变量没有帮助。所以,让我们避免关闭...嗯......你需要某种消息,例如事件听众或观察者......我们又回到原点。
与
相比,我不会称之为理智document.getElementById("contentAreaContextMenu").addEventListener(...)
我称之为“过度杀伤,没有可衡量的好处”。
onpopupshowing=
可以覆盖<menupopup onpopupshowing=
。是的,那可能会飞......除了其他附加组件可能有相同的想法,所以欢迎兼容地狱。此外,这又涉及将东西推入窗口,这会导致跨隔离包装,这会使事情再次出错。
这是一个解决方案吗?也许吧,但不是理智的。
不多,真的。
答案 1 :(得分:1)
是的,这绝对是可能的。 Mozillazine的Morat在这里给出了一个很好的解决方案:http://forums.mozillazine.org/viewtopic.php?p=13307339&sid=0700480c573017c00f6e99b74854b0b2#p13307339
function handleClick(event) {
window.removeEventListener("click", handleClick, true);
event.preventDefault();
event.stopPropagation();
var node = document.popupNode;
document.popupNode = event.originalTarget;
var menuPopup = document.getElementById("contentAreaContextMenu");
var shiftKey = false;
gContextMenu = new nsContextMenu(menuPopup, shiftKey);
if (gContextMenu.onImage) {
var imgurl = gContextMenu.mediaURL || gContextMenu.imageURL;
}
else if (gContextMenu.hasBGImage && !gContextMenu.isTextSelected) {
var imgurl = gContextMenu.bgImageURL;
}
console.log('imgurl = ', imgurl)
document.popupNode = node;
gContextMenu = null;
}
window.addEventListener("click", handleClick, true);
这使您可以访问具有各种属性的gContextMenu
,例如,如果您是通过链接,或右键单击图像,并且如果您执行了gContextMenu.imageURL
保持其值。很酷的东西
这里的代码控制台记录imgurl
,如果你不在图像上,它将记录undefined