ブラウザのタブコンテキストメニューにメニュー項目を追加してWebサービスにタブのURLを送信するFirefox拡張機能を作成しています。私はcommand
イベントリスナーは、メニュー項目が選択され、それが正常に動作するときに発生する私のメニュー項目のために持っています。Firefoxのアドオンで右クリックしたタブのURLを取得する方法
問題は、受信したイベントに基づいてどのタブが右クリックされたかを把握していることです。タブコンテキストメニューはXUL-landのタブの子ではないため、メニュー項目自体(command
イベントのターゲット)からタブへの簡単なパスはありません。もちろん、現在のタブを手に入れることはできません。なぜなら、ユーザーが非アクティブなタブを右クリックしている可能性があるからです。
私が現在使用している解決策は、グローバル変数にタブのURLを格納する各タブにcontextmenu
イベントハンドラを配置し、このグローバル変数をcommand
イベントハンドラで使用することです。これはうまく動作し、複数のコンテキストメニューを同時に表示することは物理的に不可能であるため、グローバル変数とはやや平和です。
もっと良い方法がありますか? command
イベントハンドラをURLを保持するクロージャで更新することを考えましたが、新しいイベントハンドラを追加する前に古いイベントハンドラを削除する必要があるという欠点があります。
私の現在のコードが何かのように見えるこの:
これは次のようになります。コンテキストメニューが表示されたら
var tabs = require("sdk/tabs");
var xultabs = require("sdk/tabs/utils");
var viewFor = require("sdk/view/core").viewFor;
var itemid = "my-extension-name";
var xulns = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
// global variable to hold tab URL and function to set it on right-click of tab
taburl = "";
function getTabURL(e) { taburl = xultabs.getTabURL(e.target); }
tabs.on('ready', function(tab) {
// set up event listener to get tab URL when tab is right-clicked
let vtab = viewFor(tab);
vtab.addEventListener("contextmenu", getTabURL);
// add our context menu item if it's not already there
let doc = viewFor(tab.window).document;
if (!doc.getElementById(itemid)) {
let menu = doc.getElementById("tabContextMenu");
let item = doc.createElementNS(xulns, "menuseparator");
menu.appendChild(item);
item = doc.createElementNS(xulns, "menuitem");
item.setAttribute("label", "My Menu Item");
item.setAttribute("id", itemid);
item.addEventListener("command", function() { pushURL(taburl) });
menu.appendChild(item);
}
});
function pushURL(url) {
// pushes the URL to the service
}
'selectedBrowser'は残念ながら、表示されているタブを必ずしも参照していないので、必ずしも右クリックされたものではありません。 *アクティブなタブのURLを調べるのに問題はありませんでしたが、それを行うにはいくつかの方法があります。私は実際にメニューコマンドで目標とされているものを知る必要があります。 – kindall
'require(" sdk/tabs/utils ")。getTabURL(e.target.ownerDocument.popupNode)'は魔法の呪文です。 – kindall
オハイオ州私は今、あなたが右のタブの要素をクリックして参照してください!素晴らしいですので、 'popupNode'はそのトリックを行います!共有して受け入れてくれてありがとう! – Noitidart