如何在Firefox插件

时间:2016-05-07 18:16:11

标签: javascript firefox-addon firefox-addon-sdk xul firefox-webextensions

我正在编写一个Firefox扩展程序,它将一个菜单项添加到浏览器的选项卡上下文菜单中,以将该选项卡的URL发送到Web服务。我的菜单项有command事件监听器,当菜单项被选中并且工作正常时会触发。

我遇到的麻烦是根据我收到的事件确定哪些标签已被右键单击。从菜单项本身(这是command事件的目标)到选项卡似乎不是一条简单的路径,因为选项卡上下文菜单不是菜单项的子项。 XUL-land中的标签。当然,我无法获取当前标签,因为用户可能右键单击了非活动标签。

我目前使用的解决方案是在每个选项卡上放置一个contextmenu事件处理程序,该选项卡将选项卡的URL存储在全局变量中,并在我的{{1}中使用此全局变量事件处理程序。这样工作正常,我对全局变量有点和平,因为在物理上不可能同时调出多个上下文菜单。

但是有更好的方法吗?我想用一个包含URL的闭包来更新我的command事件处理程序,但是它的缺点是需要在添加新事件之前删除旧的事件处理程序,这会使事情进一步复杂化。

我当前的代码看起来像这样:

command

1 个答案:

答案 0 :(得分:2)

当显示上下文菜单时,您可以通过执行以下操作来确定触发弹出窗口的元素:

e.target.ownerDocument.popupNode

这可能很有用,但您真正需要的只是ownerDocument.defaultView

我认为甚至还有一个e.view属性来保存浏览器窗口。

例如:

function contextMenuShowing(e) {
    console.log('context menu showing', 'popupNode:', e.target.ownerDocument.popupNode);
    var currentWindow = e.target.ownerDocument.defaultView; // can try var currentWindow = e.view;
    if (currentWindow.gBrowser) {
          var tabURL  = gBrowser.selectedBrowser.currentURI;
    }
}

cToolbarContextMenu.addEventListener('popupshowing', contextMenuShowing, false);

另一种方法是,因为在右键单击时,这显然意味着窗口是聚焦的。所以你可以这样做:

const { getMostRecentBrowserWindow } = require('sdk/window/utils');

cToolbarContextMenu.addEventListener('popupshowing', function() {
    var currentWindow = getMostRecentBrowserWindow();
    if (currentWindow.gBrowser) {
         var tabURL = currentWindow.gBrowser.selectedBrowser.currentURI.spec;
    }
}, false);