我正在编写一个Firefox扩展程序,它将一个菜单项添加到浏览器的选项卡上下文菜单中,以将该选项卡的URL发送到Web服务。我的菜单项有command
事件监听器,当菜单项被选中并且工作正常时会触发。
我遇到的麻烦是根据我收到的事件确定哪些标签已被右键单击。从菜单项本身(这是command
事件的目标)到选项卡似乎不是一条简单的路径,因为选项卡上下文菜单不是菜单项的子项。 XUL-land中的标签。当然,我无法获取当前标签,因为用户可能右键单击了非活动标签。
我目前使用的解决方案是在每个选项卡上放置一个contextmenu
事件处理程序,该选项卡将选项卡的URL存储在全局变量中,并在我的{{1}中使用此全局变量事件处理程序。这样工作正常,我对全局变量有点和平,因为在物理上不可能同时调出多个上下文菜单。
但是有更好的方法吗?我想用一个包含URL的闭包来更新我的command
事件处理程序,但是它的缺点是需要在添加新事件之前删除旧的事件处理程序,这会使事情进一步复杂化。
我当前的代码看起来像这样:
command
答案 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);