2012-02-09 2 views
3

Я использую Dojo 1.6.1, и я хочу сделать так, чтобы мой диалог Dojo можно было закрыть, щелкнув вне самого диалога. После исследования, это выглядит как один из простейших способов сделать это, делая что-то вроде этого:Закройте 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 возвращается говоря, что это не определено. Что мне недостает, чтобы выполнить это, или есть еще более простой способ сделать это?

UPDATE Я обновил код, который работает, но он работает только после того, как я вызвал .show в одном из моих диалогов, а затем послесловие - это все соус. Похоже, что подкладка не создается, пока не появится хотя бы один диалог.

+0

Вы также можете попробовать TooltipDialog. У этого есть другой пользовательский интерфейс, но поведение близко к тому, что вы ищете. – peller

ответ

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(); 
       } 
      } 
     } 
    }); 
}); 
+0

Не забудьте проверить свой ответ, как принято. – mtyson

1

Если вы можете открыть несколько диалоговых окон, это означает, что они вложены и активированы друг другом. Но есть только одна подкладка, которая перемещается (zIndex) каждый раз, когда открывается новое диалоговое окно. Может быть хорошей идеей использовать виджет типа контроллера для «хранения» каждого экземпляра диалогового окна. Как свойство dialogList, в котором вы будете нажимать новые диалоговые окна. И затем onClick на подкладке, вы скрываете диалоги, начиная с последнего в списке. Я думаю, что «порядок» важен, когда вы пытаетесь скрыть их в общем, как и вы. Надеюсь, что это поможет :)

+0

Спасибо за предложение! Я обновил свой вопрос, чтобы включить больше откровений, которые я нашел. –

Смежные вопросы