Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firefox addon 用于在firefox中向[tools]菜单添加项目的xul或sdk解决方案_Firefox Addon_Firefox Addon Sdk - Fatal编程技术网

Firefox addon 用于在firefox中向[tools]菜单添加项目的xul或sdk解决方案

Firefox addon 用于在firefox中向[tools]菜单添加项目的xul或sdk解决方案,firefox-addon,firefox-addon-sdk,Firefox Addon,Firefox Addon Sdk,好的,我创建了一个菜单项 var menuitem = require("menuitems").Menuitem({ id: "menu_item_id", menuid: "menu_ToolsPopup", label: "menu_item", onCommand: function() { console.log("clicked menu item"); }, }); 现在我想在上面添加一个子菜单项 这似乎不管用 var menu

好的,我创建了一个菜单项

    var menuitem = require("menuitems").Menuitem({
    id: "menu_item_id",
    menuid: "menu_ToolsPopup",
    label: "menu_item",
    onCommand: function() {
    console.log("clicked menu item");
 },

});
现在我想在上面添加一个子菜单项

这似乎不管用

var menuitem = require("menuitems").Menuitem({
id: "sub_menu_item_id",
menuid: "menu_item_id", <= parent element id
label: "sub_menu_item",
onCommand: function() {
console.log("clicked menu item");
},

});
var menuitem=require(“menuitems”).menuitem({
id:“子菜单项id”,

menuid:“menu\u item\u id”我前几天帮过某人做过这个。但它依赖于非sdk解决方案。我还看到您没有将菜单附加到小部件,只是添加到上下文菜单中。但仅供参考,我就是这样做的:


将其复制粘贴到main.js中。当您右键单击所有带有选项卡的窗口中的第一个选项卡元素(在选项卡栏中)时,这应该会添加上下文菜单。只是一个测试,向您展示它如何按照您的要求工作。此代码未经测试

var {Cc, Cu, Ci} = require('chrome');
Cu.import('resource://gre/modules/Services.jsm');

    var myMenuJson =
['xul:menupopup', {id: 'myMenu1'},
['xul:menuitem', {label:'menu item1'}],
['xul:menu', {label:'menu item2 is submenu1'},
['xul:menupopup', {},
['xul:menuitem', {label:'submenu1 item1'}],
['xul:menuitem', {label:'submenu1 item2'}],
['xul:menuitem', {label:'submenu1 item3'}]
]
],
['xul:menuitem', {label:'menu item3 is before a seperator'}],
['xul:menuseparator', {}],
['xul:menuitem', {label:'menu item4 is after a seperator'}]
];



    let DOMWindows = Services.wm.getEnumerator(null);
while (DOMWindows.hasMoreElements()) {
let aDOMWindow = DOMWindows.getNext();
if (aDOMWindow.gBrowser && aDOMWindow.gBrowser.tabContainer) {
var doc = aDOMWindow.document;
aDOMWindow.gBrowser.tabContainer.childNodes[0].setAttribute('context', 'myMenu1');
var mainPopupSet = doc.getElementById('mainPopupSet');
mainPopupSet.appendChild(jsonToDOM(myMenuJson, doc, {}));
}
}







/*dom insertion library function from MDN - https://developer.mozilla.org/en-US/docs/XUL_School/DOM_Building_and_HTML_Insertion*/
jsonToDOM.namespaces = {
html: 'http://www.w3.org/1999/xhtml',
xul: 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'
};
jsonToDOM.defaultNamespace = jsonToDOM.namespaces.html;
function jsonToDOM(xml, doc, nodes) {
function namespace(name) {
var m = /^(?:(.*):)?(.*)$/.exec(name);
return [jsonToDOM.namespaces[m[1]], m[2]];
}

function tag(name, attr) {
if (Array.isArray(name)) {
var frag = doc.createDocumentFragment();
Array.forEach(arguments, function (arg) {
if (!Array.isArray(arg[0]))
frag.appendChild(tag.apply(null, arg));
else
arg.forEach(function (arg) {
frag.appendChild(tag.apply(null, arg));
});
});
return frag;
}

var args = Array.slice(arguments, 2);
var vals = namespace(name);
var elem = doc.createElementNS(vals[0] || jsonToDOM.defaultNamespace, vals[1]);

for (var key in attr) {
var val = attr[key];
if (nodes && key == 'key')
nodes[val] = elem;

vals = namespace(key);
if (typeof val == 'function')
elem.addEventListener(key.replace(/^on/, ''), val, false);
else
elem.setAttributeNS(vals[0] || '', vals[1], val);
}
args.forEach(function(e) {
try {
elem.appendChild(
Object.prototype.toString.call(e) == '[object Array]'
?
tag.apply(null, e)
:
e instanceof doc.defaultView.Node
?
e
:
doc.createTextNode(e)
);
} catch (ex) {
elem.appendChild(doc.createTextNode(ex));
}
});
return elem;
}
return tag.apply(null, xml);
}
/*end - dom insertion library function from MDN*/

谢谢你的回复,之前没有提到过,但我正在尝试在firefox的主菜单(如工具)中为菜单项添加子菜单,而不是上下文菜单,你知道如何将myMenuJson附加到上面的菜单吗?基本上,(xul)是如何添加的或者overlay file=>fit-into-main.jsxul根本不适合main.js。但是,您可以在运行时创建xul,但这不是sdk方法。让我们等一等,看看是否有人有sdk解决方案,如果他们没有,我会给您一个非sdk解决方案。这里有一个提示:。此示例是为单个菜单项而不是子菜单设置的,如果这里没有人回复使用sdk解决方案,我会将其设置为子菜单。是的,你现在可以让我知道……这是我想要的非常简单的东西,[Tools]->[menu\u item]->[sub\u menu\u item1和2],我就是这样做的:Oops忘记了,粘贴在require('chrome')行之后的顶部:
Cu.import('resource://gre/modules/Services.jsm);
你有
var{Cc,Cu,Ci}=require('chrome');
在Cu.import行之前?我不知道如何编译或测试sdk加载项我做引导工作将jsonToDOM.namespace和库代码移到moduel的顶部并尝试一下看我链接的要点伙计,你必须调试错误,这不在我这边
var {Cc, Cu, Ci} = require('chrome');
Cu.import('resource://gre/modules/Services.jsm');

    var myMenuJson =
['xul:menupopup', {id: 'myMenu1'},
['xul:menuitem', {label:'menu item1'}],
['xul:menu', {label:'menu item2 is submenu1'},
['xul:menupopup', {},
['xul:menuitem', {label:'submenu1 item1'}],
['xul:menuitem', {label:'submenu1 item2'}],
['xul:menuitem', {label:'submenu1 item3'}]
]
],
['xul:menuitem', {label:'menu item3 is before a seperator'}],
['xul:menuseparator', {}],
['xul:menuitem', {label:'menu item4 is after a seperator'}]
];



    let DOMWindows = Services.wm.getEnumerator(null);
while (DOMWindows.hasMoreElements()) {
let aDOMWindow = DOMWindows.getNext();
if (aDOMWindow.gBrowser && aDOMWindow.gBrowser.tabContainer) {
var doc = aDOMWindow.document;
aDOMWindow.gBrowser.tabContainer.childNodes[0].setAttribute('context', 'myMenu1');
var mainPopupSet = doc.getElementById('mainPopupSet');
mainPopupSet.appendChild(jsonToDOM(myMenuJson, doc, {}));
}
}







/*dom insertion library function from MDN - https://developer.mozilla.org/en-US/docs/XUL_School/DOM_Building_and_HTML_Insertion*/
jsonToDOM.namespaces = {
html: 'http://www.w3.org/1999/xhtml',
xul: 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'
};
jsonToDOM.defaultNamespace = jsonToDOM.namespaces.html;
function jsonToDOM(xml, doc, nodes) {
function namespace(name) {
var m = /^(?:(.*):)?(.*)$/.exec(name);
return [jsonToDOM.namespaces[m[1]], m[2]];
}

function tag(name, attr) {
if (Array.isArray(name)) {
var frag = doc.createDocumentFragment();
Array.forEach(arguments, function (arg) {
if (!Array.isArray(arg[0]))
frag.appendChild(tag.apply(null, arg));
else
arg.forEach(function (arg) {
frag.appendChild(tag.apply(null, arg));
});
});
return frag;
}

var args = Array.slice(arguments, 2);
var vals = namespace(name);
var elem = doc.createElementNS(vals[0] || jsonToDOM.defaultNamespace, vals[1]);

for (var key in attr) {
var val = attr[key];
if (nodes && key == 'key')
nodes[val] = elem;

vals = namespace(key);
if (typeof val == 'function')
elem.addEventListener(key.replace(/^on/, ''), val, false);
else
elem.setAttributeNS(vals[0] || '', vals[1], val);
}
args.forEach(function(e) {
try {
elem.appendChild(
Object.prototype.toString.call(e) == '[object Array]'
?
tag.apply(null, e)
:
e instanceof doc.defaultView.Node
?
e
:
doc.createTextNode(e)
);
} catch (ex) {
elem.appendChild(doc.createTextNode(ex));
}
});
return elem;
}
return tag.apply(null, xml);
}
/*end - dom insertion library function from MDN*/