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