Ich schreibe eine Firefox-Erweiterung, die dem Tab-Kontextmenü des Browsers einen Menüeintrag hinzufügt, um die URL des Tabs an einen Web-Service zu senden. Ich habe einen command
Event-Listener für meinen Menüpunkt, der ausgelöst wird, wenn der Menüpunkt ausgewählt wird und das funktioniert.So erhalten Sie die URL des Rechtsklick-Tabs in einem Firefox-Add-on
Das Problem, das ich habe, ist herauszufinden, welche Registerkarte rechts geklickt wurde basierend auf dem Ereignis, das ich erhalte. Es scheint keinen einfachen Weg von dem Menüelement selbst (welches das Ziel des Ereignisses command
ist) zu der Registerkarte zu geben, da das Registerkartenkontextmenü kein Kind der Registerkarte in XUL-Land ist. Ich kann natürlich nicht nur die aktuelle Registerkarte abrufen, da der Benutzer möglicherweise mit der rechten Maustaste auf eine inaktive Registerkarte geklickt hat.
Die Lösung, die ich derzeit verwende, ist eine contextmenu
Event-Handler auf jeder Registerkarte, die die URL der Registerkarte in einer globalen Variablen speichert, und verwenden Sie diese globale Variable in meinem command
Event-Handler. Das funktioniert gut und ich bin mit der globalen Variable etwas in Ruhe, da es physikalisch unmöglich ist, gleichzeitig mehr als ein Kontextmenü aufzurufen.
Aber gibt es einen besseren Weg? Ich dachte daran, meinen command
Event-Handler mit einer Schließung zu aktualisieren, die die URL enthält, aber das hat den Nachteil, dass ich den alten Event-Handler entfernen muss, bevor ich den neuen hinzufüge, was die Dinge noch weiter verkompliziert.
Mein aktueller Code sieht aus wie etwas das:
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' hilft leider nicht, da es sich immer auf die sichtbare Registerkarte bezieht, die nicht unbedingt die ist, die mit der rechten Maustaste geklickt wurde. Ich hatte keine Probleme, die URL der Registerkarte * active * herauszufinden, es gibt mehrere Möglichkeiten, dies zu tun. Ich muss wissen, dass der Menübefehl das Ziel ist. – kindall
Es stellt sich heraus, dass 'require ("sdk/tabs/utils"). GetTabURL (e.target.ownerDocument.popupNode)' ist die magische Beschwörung. – kindall
Ohhh ich sehe jetzt, Sie klicken mit der rechten Maustaste auf den Tab-Element! Super, damit der 'popupNode' den Trick macht! Danke für das Teilen und das Akzeptieren! – Noitidart