我有一个非常简单的扩展,我想根据内容在上下文菜单中显示一个新项目,这应该非常简单,并且有很多教程展示了如何完成这项工作。
问题是,只要在popupshowing
我的新元素上添加contecontentAreaContextMenu
的监听器,即使我不隐藏它也不会显示。
这是xul代码:
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/global.css" type="text/css"?>
<?xml-stylesheet href="chrome://Prot-On/skin/Prot-On.css" type="text/css"?>
<!DOCTYPE window SYSTEM "chrome://Prot-On/locale/Prot-On.dtd">
<overlay id="Prot-On" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript" src="chrome://Prot-On/content/prot-on.js"/>
<popup id="contentAreaContextMenu">
<menuitem id="prot-on-main-item" label="Hello, world!" oncommand="proton.hello();"/>
</popup>
</overlay>
并且prot-on.js:
var proton = {
init : function() {
try {
if (document.getElementById("contentAreaContextMenu")) {
document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", this.showContextMenu, false);
}
} catch (e) {
this.manageException(e);
}
},
hello : function (){
try {
alert("Hello, world2!");
} catch (e) {
this.manageException(e);
}
},
showContextMenu : function (event){
try {
var show = document.getElementById("prot-on-main-item");
show.setAttribute("hidden", false);
} catch (e) {
this.manageException(e);
}
},
manageException : function (exception) {
window.openDialog(
"chrome://Prot-On/content/resources/html/showErrorBacktrace.htm",
"errorbacktrace",
"centerscreen=yes,chrome=yes,modal=yes,resizable=yes",
exception,
"display error"
);
}
}
try {
window.addEventListener("load", proton.init(), false);
} catch (e) {
proton.manageException(e);
}
如果我只是评论这些行:
if (document.getElementById("contentAreaContextMenu")) {
document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", this.showContextMenu, false);
}
一切都按预期工作,所以我不确定是什么问题。
manageException函数只显示任何异常的附加信息及其正常工作,以防你想知道。
答案 0 :(得分:1)
您在窗口加载时立即执行proton.init
,而不是将引用传递给addEventListener
。
更改此行:
window.addEventListener("load", proton.init(), false);
致:
window.addEventListener("load", function() {
proton.init();
}, false);