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>にすること<menupopup>です。さらに、MDNを見ると、代わりdocument.popupNodeに使用することをお勧めします.triggerNode。さらに、popupshowingイベント参照を見ると、がありますが、これが(以下でこれを想定しています)、クリックされたノード、または他の何かである.targetかどうかは明らかではありません(コードのコメントを参照)。<menupopup>

次のコードは、上記を利用し、 onpopupshowing属性.addEventListenerを使用する可能性のある他のものとの競合がないことを確認するために、を使用してリスナーをアタッチします。

あなたの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 に答える