通过单击外部来关闭Dojo对话框

时间:2012-02-09 21:56:24

标签: javascript dialog dojo

我正在使用Dojo 1.6.1并且我想这样做,因此可以通过单击对话框本身外部来关闭我的Dojo Dialog。经过研究,看起来最简单的方法之一就是做这样的事情:

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回来说它是未定义的。为实现这一目标我还缺少什么,或者有更简单的方法来做到这一点?

更新我更新了有效的代码,但只有在我在其中一个对话框上调用.show之后才会生效,然后才会使用它们。看起来在至少显示一个对话框之前不会创建参考底图。

2 个答案:

答案 0 :(得分:5)

我觉得这很快就搞砸了。诀窍是,dijit._underlay不会被初始化,直到您第一次调用对话框的.show()。之后,它将重新使用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();  
                }
            }
        }
    });
});

答案 1 :(得分:1)

如果你可以打开几个对话框,那就意味着它们是由彼此嵌套和触发的。 但每次打开一个新对话框时,只有一个底层被重新定位(zIndex)。 使用控制器类型小部件来“存储”每个对话框实例可能是个好主意。 就像一个dialogList属性,你将在其中推送新的Dialogs。 然后单击底衬,隐藏从列表中的最后一个开始的对话框。 我认为当你试图像你一样隐藏它们时,“顺序”很重要。 希望这会有所帮助:)