2011-12-07 143 views
1

我有一個非常簡單的擴展,我想根據內容在上下文菜單上顯示一個新項目,這應該很簡單,並且有很多教程顯示了必須完成的操作。Firefox上下文菜單項不顯示

問題是,只要我在contecontentAreaContextMenu上添加了我的新元素popupshowing的偵聽器,即使我不隱藏它,它也不會顯示。

下面是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

您立即在窗口加載時執行proton.init,而不是將其引用傳遞給addEventListener

改變這一行:

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

要:

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

我現在感覺讓人看見,這種愚蠢的事情。無論如何感謝您的解決方案。 – frisco