0

コンテキスト メニューに menuitem を追加する 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。イベント プロパティでは、イベント ハンドラは 1 つしか存在できません。成功すると、Firefox によって定義されたデフォルトのコンテキスト メニュー ハンドラがオーバーライドされる可能性があります。addEventListener代わりに、同じイベントに複数のイベント リスナーを追加できるようにする必要があります。もちろん、間違ったイベントを使用しています。イベントはcontextmenu、コンテキスト メニューではなく、ユーザーがクリックした要素で発生します。この場合、XUL はコンテキスト メニューを開くことによってこのイベントを処理しますcontentAreaContextMenu。コンテキスト メニューは独自のイベント、つまり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 コードや他の拡張機能と名前が競合する可能性があります。それらはすべて同じ名前空間でコードを実行します。匿名関数内で変数と関数を宣言することにより、この問題を完全に回避できます。

于 2012-05-21T06:35:53.493 に答える
0

popupshowingイベントを使用してみてください。

于 2012-05-20T22:53:22.847 に答える