2012-02-09 2 views
3

Dojo 1.6.1을 사용 중입니다. 대화 상자 외부를 클릭하여 Dojo Dialog 's를 닫을 수 있도록하고 싶습니다. dijit._underlay 그것이 정의되지 않은 말을 다시오고 있기 때문에Outside Of 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(); 
       } 
      } 
     } 
    }); 
}); 

그러나이 작동하지 않습니다 :이 작업을 수행 할 수있는 simpliest 방법 중 하나는 다음과 같은 일을하는 것입니다 같은 연구 후에, 그것은 보인다. 이 작업을 수행하기 위해 내가 누락되었거나 더 쉽게이 작업을 수행 할 수 있습니까?

업데이트 코드 업데이트 된 코드는 내 대화 상자에서 .show를 호출 한 후에 만 ​​작동합니다. 이후에는 모두 그레이비입니다. 하나 이상의 대화 상자가 표시 될 때까지 언더 레이가 만들어지지 않은 것처럼 보입니다.

+0

TooltipDialog를 사용해보십시오. 그것은 다른 UI를 가지고 있지만 행동은 당신이 찾고있는 것과 비슷합니다. – 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 속성과 같습니다. 그런 다음 언더 레이를 클릭하면 목록의 마지막에서 시작하는 대화 상자가 숨겨집니다. "주문"은 내가 일반적으로 숨길 때 중요하다고 생각합니다. 희망이 도움이 될 것입니다 :)

+0

제안 해 주셔서 감사합니다! 내가 발견 한 더 많은 계시를 포함하도록 내 질문을 업데이트했습니다. –

관련 문제