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换句话说:这就像两个“弹出窗口”互相有麻烦。

我需要在显示叠加层之前运行“刷新”功能。我的结构在某处有问题吗?如何处理两个嵌套的弹出窗口及其popupshowing事件?

4

1 回答 1

0

事件popupshowing冒泡意味着它可以被 DOM 层次结构中比触发事件的元素更高的事件处理程序拦截。因此,您的事件处理程序首先从元素接收popupshowing事件,<panel>然后从元素接收另一个事件<menulist>(因为它位于 内<panel>)。event.eventPhase您可以使用以下属性轻松区分这两种情况:

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

这将确保您忽略冒泡Refresh()的事件,并且只调用源自<panel>自身的事件。另一种选择是查看event.target房产

于 2012-06-21T20:59:03.193 回答