0

[更新] 我可能错误地解释了这个问题:我知道如何隐藏菜单元素 - 但如何测试点击的元素是否可编辑?Chrome 检测到一个可编辑的元素 - 如何在 ff 中实现它。

我试图让我的项目在上下文菜单中仅在单击图像时显示

这是我的emailpicture.js

代码:

function showHideItems(event)
{   
      var show = document.getElementById("emailImage");
      show.hidden = !(gContextMenu.onImage);
}

和 xul 代码:

<?xml version="1.0"?>
<overlay id="emailpicture" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript" src="chrome://emailpicture/content/emailpicture.js"/>

<menupopup id="contentAreaContextMenu">
  <menuitem id="emailImage" label="Email This Image" onpopupshowing="showHideItems()" oncommand=""/>

</menupopup>


</overlay>

这样做的结果是在浏览器中的每个对象上显示一堆项目(可能是 FireFox 的所有项目)我应该使用该onpopupshowing事件吗?还是另一个?我用对了吗?

感谢您的回答

4

1 回答 1

3

如果您查看ContextMenu MDN 页面,他们有一个示例。您当前代码的主要问题是您已将onpopupshowing放在<menuitem>when it should be on 上<menupopup>。此外,如果您查看 MDN,document.popupNode它会说我们鼓励您.triggerNode改用它。此外,查看popupshowing 事件引用,我们看到它有一个.target,但不清楚这是<menupopup>(我在下面假设)、被单击的节点还是其他东西(参见代码中的注释)。

以下代码利用了上述内容并附加了侦听器.addEventListener,以确保不与可能使用onpopupshowing属性的任何其他内容发生冲突。

在你的emailpicture.js

// First define listener
function showHideItems(e) {
    var menupopup = e.target, // I believe `.target` is the <menupopup>, otherwise use `this`. 
        triggerNode = menupopup.triggerNode, // get node that was clicked to open context menu
        triggerIsImage = (triggerNode instanceof Components.interfaces.nsIImageLoadingContent && triggerNode.currentURI),
          // test if it is an image (as from MDN, I would've gone with `.nodeType` and `.nodeName` checks?)
        elmToHide = menupopup.getElementById('emailImage');
    if(elmToHide)
        elmToHide.hidden = !triggerIsImage;
}
// Then attach it to <menupopup>, remember the element has to exist before you can do this so you might want to wait for DOMContentLoaded
document.getElementById('contentAreaContextMenu')
    .addEventListener('popupshowing', showHideItems, false);

然后对于 XUL 不包括属性onpopupshowing

我会指出我没有对此进行测试,所以如果它不起作用,首先检查偶数是否被触发,然后检查.target是否符合我的假设(将来可能会为其他人澄清 MDN)。

于 2012-12-20T01:44:04.723 回答