0

Firefoxの拡張機能を開発していて、XULコードを中に入れたオーバーレイを表示するツールバーボタンがありますToolbarDisplayManager

<overlay id="custombutton-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

        <toolbarpalette id="BrowserToolbarPalette">
            <toolbarbutton id="boycottToolbarButton" label="Label" tooltiptext="Label" type="menu" popup="ToolbarPopup" />
        </toolbarpalette>
        <popupset>
            <panel id="ToolbarPopup" position="after_start" onpopupshowing="Refresh();">
                <vbox class="ToolbarBody">
                    <box id="ToolbarDisplayManager" />
                </vbox>
            </panel>
        </popupset>
</overlay>

「ToolbarDisplayManager」内で、次の構造のjavascript(「コンボボックス」など)を使用したmenupopupを使用してメニューリストを作成します。

<menulist id="combo">
    <menupopup>
        <menuitem>
        <menuitem>
        ...
    </menupopup>
</menulist>

問題は次のとおりです。クリックToolbarPopupすると、イベントで「更新」機能が実行されpopupshowingます。しかし、オーバーレイが表示され、「コンボ」をクリックしてアイテムを選択すると、のpopupshowingイベントがToolbarPopup再度発生します。言い換えれば、2つの「ポップアップ」が互いに問題を抱えているようなものです。

オーバーレイが表示される直前に「更新」機能を実行する必要があります。私の構造はどこか間違っていますか?popupshowing2つのネストされたポップアップとそのイベントを処理するにはどうすればよいですか?

4

1 に答える 1

0

イベントはバブルアップします。popupshowingつまり、イベントをトリガーする要素よりもDOM階層の上位にあるイベントハンドラーによってインターセプトされる可能性があります。したがって、イベントハンドラーは、最初にとから別のpopupshowingイベントを受け取り、<panel>後で要素から別のイベントを受け取ります<menulist>(これは、の内部にあるためです<panel>)。event.eventPhaseプロパティを使用して、2つのケースを簡単に区別できます。

<panel ... onpopupshowing="if (event.eventPhase == Event.AT_TARGET) Refresh();">

これにより、バブリングするイベントを無視し、それ自体Refresh()で発生したイベントのみを呼び出すようになり<panel>ます。他のオプションは、event.targetプロパティを調べることでした。

于 2012-06-21T20:59:03.193 に答える