我正在开发一个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
个事件?
答案 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。