从firefox的上下文菜单中获取menuitem

时间:2012-05-20 21:49:38

标签: javascript firefox-addon contextmenu xul

我已经编写了一个Firefox扩展程序,它将一个menuitem添加到上下文菜单中,现在我想要隐藏该项目,除非点击的上下文在文本上。
由于某种原因,从不触发oncontextmenu事件(屏幕上未显示“上下文打开”) 我已经尝试过更改但仍然没有被解雇的警报,任何人都知道我可能在这里做错了什么?谢谢!

<?xml version="1.0"?>
<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">  
    <script>
    function contextClicked(){
        alert('context opened')
        var saveToFileItem = document.getElementById("saveToFile");
    }
    </script>

    <menupopup id="contentAreaContextMenu" oncontextmenu="contextClicked();">
        <script type="application/javascript" src="chrome://ffext/content/overlay.js"/>
        <menuitem id="saveToFile" label="Save to File" oncommand="ffext.run();"/>
    </menupopup>
</overlay>

2 个答案:

答案 0 :(得分:1)

不要这样做 - 使用onfoo事件属性只能有一个事件处理程序。如果成功,您可能会覆盖Firefox定义的默认上下文菜单处理程序。您应该使用addEventListener而不是允许为同一事件添加多个事件侦听器。当然,你使用的是错误的事件。 contextmenu事件触发用户单击的元素,而不是上下文菜单。在这种情况下,XUL通过打开上下文菜单contentAreaContextMenu来处理此事件。然后上下文菜单获得its own events - 即popupshowingpopupshown。上下文菜单初始化代码通常附加到popupshowing事件。

因此,您应该将与此类似的代码放入overlay.js文件中:

// Do not try to do anything before the window loads
window.addEventListener("load", function()
{
   function contextClicked(event)
   {
     alert('context opened')
     var saveToFileItem = document.getElementById("saveToFile");
   }

   // Add contextClicked as event listener to the context menu
   var contextMenu = document.getElementById("contentAreaContextMenu");
   contextMenu.addEventListener("popupshowing", contextClicked, false);
}, false);

请注意,此代码在函数内定义contextClicked - 这是我通常建议的方法。如果您在全局定义事物,则可能会遇到与现有Firefox代码或其他扩展名称冲突的问题 - 所有这些代码都在同一名称空间中运行。通过在匿名函数中声明变量和函数,您可以完全避免此问题。

答案 1 :(得分:0)

尝试使用popupshowing事件。