У меня действительно простое расширение, и я хочу показать новый элемент в контекстном меню в зависимости от содержимого, это должно быть довольно просто, и есть много обучающих программ, показывающих, как это должно быть сделано.
Проблема в том, что как только я добавляю слушателя для 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>
И pro-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 просто отображает дополнительную информацию о любом исключении и работает правильно, на случай, если вам интересно.