嵌套弹出窗口,popupshowing事件的麻烦

时间:2012-06-21 16:21:31

标签: javascript-events firefox-addon

我正在开发一个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”里面我创建了一个带有manupopup的menulop,其中包含javascript(如“combobox”),具有以下结构:

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

这是问题所在: 当我点击ToolbarPopup时,我在popupshowing事件中运行了“刷新”功能。但是当显示叠加层时,我单击“组合”以选择项目,popupshowing事件ToolbarPopup将再次触发。 换句话说:就像两个“弹出窗口”相互之间有麻烦一样。

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

1 个答案:

答案 0 :(得分:0)

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

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

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