Firefox上下文菜单项未显示

时间:2011-12-07 12:18:19

标签: firefox firefox-addon contextmenu

我有一个非常简单的扩展,我想根据内容在上下文菜单中显示一个新项目,这应该非常简单,并且有很多教程展示了如何完成这项工作。

问题是,只要在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函数只显示任何异常的附加信息及其正常工作,以防你想知道。

1 个答案:

答案 0 :(得分:1)

您在窗口加载时立即执行proton.init,而不是将引用传递给addEventListener

更改此行:

window.addEventListener("load", proton.init(), false);

致:

window.addEventListener("load", function() {
    proton.init();
}, false);