2012-02-09 45 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

相关问题