Элемент контекстного меню Firefox не отображается - PullRequest
1 голос
/ 07 декабря 2011

У меня действительно простое расширение, и я хочу показать новый элемент в контекстном меню в зависимости от содержимого, это должно быть довольно просто, и есть много обучающих программ, показывающих, как это должно быть сделано.

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

1 Ответ

1 голос
/ 07 декабря 2011

Вы немедленно выполняете proton.init при загрузке окна вместо передачи ссылки на него addEventListener.

Изменить эту строку:

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

Кому:

window.addEventListener("load", function() {
    proton.init();
}, false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...