2012-02-09 43 views
3

我使用道場1.6.1之外,我想使它所以我的道場對話框的可以通過點擊對話框本身之外被關閉。經過研究,它看起來像來完成這個simpliest方法之一是做這樣的事情:關閉一個Dojo對話框點擊它

var dij = dijit._underlay.domNode; 
dojo.connect(dij, "onclick", function(e) { 
    dojo.query('[role="dialog"]').forEach(function(element) { 
     if (element.className.match("dijit")) { 
      if(element.id) 
      { 
       var widget = dijit.byId(element.id); 
       if(widget._isShown() === true) 
       { 
        widget.hide(); 
       } 
      } 
     } 
    }); 
}); 

然而,由於dijit._underlay是回來說這是不確定的,這並不工作。我錯過了什麼來完成這個任務,還是有更簡單的方法來做到這一點?

UPDATE我更新了可以工作的代碼,但它只在我的一個對話框中調用.show後才起作用,然後後續操作都是肉汁。直到至少顯示一個對話框,纔會創建底圖。

+0

您也可以嘗試TooltipDialog。它有一個不同的用戶界面,但行爲接近你要找的東西。 – peller 2012-02-10 04:06:21

回答

5

我覺得傻想出來的這個迅速。訣竅是,直到您第一次調用對話框的.show()時,dijit._underlay纔會被初始化。之後,它會重新使用dijit._underlay。但是,你可以在自己的前面做同樣的伎倆。所以,我檢查是否存在dijit._underlay。但是,如果它沒有被創建,我會這樣做,所有的對話框都會關閉這個對話框。所以,這裏是工作代碼:

var dij = null; 
if(dijit._underlay === undefined) 
{ 
    dijit._underlay = new dijit.DialogUnderlay(); 
} 
dij = dijit._underlay.domNode; 
dojo.connect(dij, "onclick", function(e) { 
    dojo.query('[role="dialog"]').forEach(function(element) { 
     if (element.className.match("dijit")) { 
      if(element.id) 
      { 
       var widget = dijit.byId(element.id); 
       if(widget._isShown() === true) 
       { 
        widget.hide(); 
       } 
      } 
     } 
    }); 
}); 
+0

不要忘記檢查你的答案爲接受。 – mtyson 2012-02-10 18:49:40

1

如果可以打開幾個對話框的,這意味着它們嵌套和彼此觸發。 但每次打開一個新的對話框時,只有一個底座重新定位(zIndex)。 使用控制器類型小部件「存儲」每個對話框實例可能是一個好主意。 就像您在其中推送新對話框的dialogList屬性一樣。 然後點擊底色,你可以隱藏列表中最後一個對話框。 當你試圖像你一樣一般地隱藏它們時,我認爲「順序」很重要。 希望這將有助於:)

+0

感謝您的建議!我更新了我的問題,以包含我發現的更多啓示。 – 2012-02-10 16:54:02

相關問題