javascript - 利用 Firefox 的默认/内置事件监听器

标签 javascript firefox-addon firefox-addon-restartless

我有一个上下文菜单项,如果右键单击图像,就会激活该菜单项,这与激活 'context-copyimage' 的方式完全相同。

是否可以将该菜单项与'context-copyimage'绑定(bind)/配对,从而消除添加额外(重复)事件监听器和显示/隐藏处理程序的需要?!!
(向 'context-copyimage' 添加观察者达不到目的)

如果没有,是否可以使用 'context-copyimage' 使用的事件监听器?

更新:
我正在努力减少听众。目前,脚本有一个 popupshowing 监听器。在 popupshowing 上,它会检查 gContextMenu.onImag,如果为 true,则显示菜单项。 Firefox 的 context-copyimage 执行完全相同的操作。我想知道是否可以将这两个结合起来以删除/减少脚本内事件监听器。

我也在和 Dagger 聊天,他说:

... the state of built-in items isn't set from an event handler, it's set from the constructor for nsContextMenu, and there are no mechanisms to hook into it

看来这是不可能的

最佳答案

不,没有合理的方法来避免使用比其他事件监听器性能更好并且与在 session 中卸载加载项兼容的事件监听器。

Hook nsContextMenu

正如您已经被告知的,状态是通过 gContextMenu = new nsContextMenu(...) 初始化的。 。所以你需要 Hook 这些东西,这实际上很容易。

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;

现在,第一个问题是:它实际上性能更好吗?毕竟这只是在原型(prototype)链中引入了另一个链接。当然,可以避免Object.create并覆盖 nsContextMenu.prototype.initMenu直接。

但真正的问题是:如何再次移除钩子(Hook)?答案:你确实不能,因为其他附加组件可能在你之后 Hook 了同样的东西,并且取消 Hook 也会取消其他附加组件的 Hook 。但是您需要删除引用,否则该附加组件在禁用/卸载时会泄漏内存。好吧,你可以用 Components.utils.makeObjectPropsNormal 来战斗,但这对于封闭变量并没有真正的帮助。所以让我们避免关闭......嗯......你需要某种消息传递,例如事件监听器或观察者...我们又回到了原点。

此外,与

相比,我不会称其为理智
document.getElementById("contentAreaContextMenu").addEventListener(...)

我称之为“没有可衡量的好处的过度杀伤”。

覆盖onpopupshowing=

可以覆盖 <menupopup onpopupshowing= 。是的,这可能会飞……除了其他附加组件可能有相同的想法,所以欢迎来到兼容性 hell 。此外,这又涉及将东西插入窗口,这会导致跨隔室包装器,这使得事情再次容易出错。

这是一个解决方案吗?也许吧,但不是一个理智的人。

还有什么?

确实不多。

关于javascript - 利用 Firefox 的默认/内置事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24692940/

相关文章:

javascript - 从复杂的 JSON 对象打印每个 JSON 输入路径

javascript - 使用 RegExp 将 API 数据中的 'undefined' 替换为 JavaScript 中的字符串

javascript - Firefox webextension 错误 : Could not establish connection. 接收端不存在

javascript - 如何在无需重新启动的 Firefox 扩展中交换数组文件?是不是更新数组元素而不是整个扩展?

javascript - 在html中显示来自nodejs的数据

javascript - 将当前时间写入 SVG 文档

rest - Firefox 附加 RESTclient - 如何输入 POST 参数?

javascript - Mozilla WebExtensions 新指南

javascript - 在无重启扩展中与 jsctypes 异步工作

javascript - 在引导插件中卸载惰性 setter/getter ?