0

我编写了一个 Firefox 扩展,它将一个菜单项附加到上下文菜单上,现在我想隐藏该项目,除非单击的上下文在文本上。
由于某种原因,永远不会触发 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>
4

2 回答 2

1

不要这样做 - 使用onfoo事件属性只能有一个事件处理程序。如果你成功了,你可能会覆盖 Firefox 定义的默认上下文菜单处理程序。您应该addEventListener改用它允许为同一事件添加多个事件侦听器。当然,您使用了错误的事件。该contextmenu事件在用户单击的元素上触发,而不是在上下文菜单上触发。在本例中,XUL 通过打开上下文菜单来处理此事件contentAreaContextMenu。然后上下文菜单获取它自己的事件- 即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 代码或其他扩展的名称冲突——它们都在同一个命名空间中运行它们的代码。通过在匿名函数中声明变量和函数,您可以完全避免这个问题。

于 2012-05-21T06:35:53.493 回答
0

尝试使用popupshowing事件。

于 2012-05-20T22:53:22.847 回答