Javascript 仅当在FireFox中单击图像时才在上下文菜单中显示项目

Javascript 仅当在FireFox中单击图像时才在上下文菜单中显示项目,javascript,firefox-addon,xul,Javascript,Firefox Addon,Xul,[更新]我可能解释错了:我知道如何隐藏菜单元素-但如何测试单击的元素是否可编辑?Chrome检测到一个可编辑元素-如何在ff中实现它 我正试图使我的项目在上下文菜单中仅在单击图像时显示 这是我的emailpicture.js 代码: 和xul代码: <?xml version="1.0"?> <overlay id="emailpicture" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xu

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

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

这是我的
emailpicture.js

代码:

和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的所有项目) 我应该使用
onpopushowing
事件吗?还是另一个? 我用对了吗

谢谢你的回答,如果你看他们有这样一个例子的话。当前代码的主要问题是,您在
应该打开的时候,在
上打开了popushow。此外,如果您查看MDN,它会说您被鼓励改为使用。此外,查看我们看到它有一个
.target
,但不清楚这是
(我假设如下)、单击的节点还是其他节点(请参见代码中的注释)

下面的代码利用了上述内容并附加了侦听器,以确保与可能使用OnPopusShowing属性的任何其他内容都不存在冲突

在emailpicture.js中

//首先定义侦听器
函数showHideItems(e){
var menupopup=e.target,//我相信`.target`是最合适的,否则使用`.this`。
triggerNode=menupopup.triggerNode,//获取单击以打开上下文菜单的节点
triggerIsImage=(triggerNode实例of Components.interfaces.nsImageLoadingContent&&triggerNode.currentURI),
//测试它是否是一个图像(从MDN开始,我会选择“.nodeType”和“.nodeName”检查?)
elmToHide=menupopup.getElementById('emailImage');
if(elmToHide)
elmToHide.hidden=!triggerIsImage;
}
//然后将其附加到,请记住,在执行此操作之前,元素必须存在,因此您可能希望等待加载DOMContentLoaded
document.getElementById('contentAreaContextMenu')
.addEventListener('popupshowing',showHideItems,false);
那么对于XUL,不要包含onpopupshowing属性

我要指出的是,我还没有测试过它,所以如果它不起作用,首先检查是否触发了偶数,然后检查
。目标
与我假设的一样(并且可能在将来为其他人澄清MDN)。

如果你看到他们有这样的例子。当前代码的主要问题是,您在
应该打开的时候,在
上打开了popushow。此外,如果您查看MDN,它会说您被鼓励改为使用。此外,查看我们看到它有一个
.target
,但不清楚这是
(我假设如下)、单击的节点还是其他节点(请参见代码中的注释)

下面的代码利用了上述内容并附加了侦听器,以确保与可能使用OnPopusShowing属性的任何其他内容都不存在冲突

在emailpicture.js中

//首先定义侦听器
函数showHideItems(e){
var menupopup=e.target,//我相信`.target`是最合适的,否则使用`.this`。
triggerNode=menupopup.triggerNode,//获取单击以打开上下文菜单的节点
triggerIsImage=(triggerNode实例of Components.interfaces.nsImageLoadingContent&&triggerNode.currentURI),
//测试它是否是一个图像(从MDN开始,我会选择“.nodeType”和“.nodeName”检查?)
elmToHide=menupopup.getElementById('emailImage');
if(elmToHide)
elmToHide.hidden=!triggerIsImage;
}
//然后将其附加到,请记住,在执行此操作之前,元素必须存在,因此您可能希望等待加载DOMContentLoaded
document.getElementById('contentAreaContextMenu')
.addEventListener('popupshowing',showHideItems,false);
那么对于XUL,不要包含onpopupshowing属性


我要指出的是,我还没有对此进行测试,因此如果它不起作用,请首先检查是否触发了偶数,然后检查
。目标
与我假设的一样(将来可能会为其他人澄清MDN)。

看看“基于上下文隐藏和显示菜单项”和“确定上下文单击了什么”。请记住,您可以将DOM方法应用于
。感谢您的快速回答,这段代码就是从这里直接获得的。我想,我的问题在于调用函数的地方,在xl文件中。有什么建议吗?哦,是的,活动应该在
上,而不是
上。将事件附加到#contentAreaContextMenu(如果您不确定设置该属性是否会导致与其他事件侦听器冲突,请通过JavaScript的
addEventListener
执行此操作)好,再次感谢。我仍然缺少的是如何添加
eventListener
——它应该包括什么以及在哪里添加它。我可以从xul文件中执行吗?看看“基于上下文隐藏和显示菜单项”和“确定上下文单击了什么”。请记住,您可以将DOM方法应用于
。感谢您的快速回答,这段代码就是从这里直接获得的。我想,我的问题在于调用函数的地方,在xl文件中。有什么建议吗?哦,是的,活动应该在
上,而不是
上。将事件附加到#contentAreaContextMenu(如果您不确定设置该属性是否会导致与其他事件侦听器冲突,请通过JavaScript的
addEventListener
执行此操作)好,再次感谢。我仍然缺少的是如何添加
eventListener
——它应该包括什么以及在哪里添加它。我可以从xul文件中进行修改吗?如果我的答案中有任何内容需要更正,请再次评论,以便我可以编辑它,如果有帮助,请向上投票/a
<?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>
// 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);