2012-06-21 71 views
0

我正在開發一個Firefox擴展,和我有一個顯示的疊加中,我把一些XUL代碼中ToolbarDisplayManager工具欄按鈕的麻煩:嵌套彈出窗口,以popupshowing事件

<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 EV一個「刷新」功能ENT。但是,當疊加顯示時,我點擊「組合」選擇一個項目,事件popupshowing再次被激發。換句話說,這就像兩個「彈出式窗口」彼此都有問題。

我需要在疊加顯示之前運行「刷新」功能。我的結構錯了嗎?我如何處理兩個嵌套彈出窗口和它們的popupshowing事件?

回答

0

popupshowing事件冒起來意味着它可以被DOM層次結構中高於觸發事件的元素的事件處理程序攔截。因此,您的事件處理程序首先收到來自<panel>popupshowing事件,然後再從<menulist>元素接收另一個事件(因爲它位於<panel>內部)。您可以使用event.eventPhase property容易區分兩種情況:

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

這將確保你忽略的事件冒泡和來電Refresh()爲起源於<panel>本身的事件。另一種選擇是一直在尋找event.target property

+0

Thanks @WladimirPalant!它完美的工作! –