dojo.query를 dijit.Dialog의 reutrn 값으로 가져오는 방법
-
05-07-2019 - |
문제
내용을 채우기 위해 Ajax 호출(href 속성)을 사용하여 dijit.Dialog를 만드는 코드가 있습니다.
반환된 콘텐츠를 dojo.connect로 구문 분석하여 반환된 콘텐츠의 링크에 대한 클릭 이벤트를 분석할 것입니다.
하지만 dojo.query("a",this.current_popup.domNode)를 수행하면 빈 배열이 반환됩니다.
반환된 모든 콘텐츠에 onclick을 첨부하는 방법을 아는 사람이 있나요?
폴
해결책
이벤트 핸들러를 대화 상자 위젯의 DOM 노드에 바인딩하고 이벤트 위임을 사용하여 "a" 클릭을 캡처하는 것이 비용이 더 저렴합니다.이렇게 하면 특히 대화 상자의 내용이 자주 변경되는 경우 이벤트 핸들러 정리를 피할 수 있습니다.작업을 수행하기 위해 위젯의 연결 메소드를 사용하면 이벤트 핸들러 정리를 피할 수 있습니다.
따라서 dijit.Dialog의 메소드 내에서 연결을 수행하는 경우 다음과 같은 것을 사용할 수 있습니다.
this.connect("onclick", function(evt){
var node = evt.target;
if("a" == node.nodeName.toLowerCase()){
//node is an a tag, do what you want with it,
//for example, read node.href to get the URL attached to it.
//If you want to prevent following that URL and prevent further
//event bubbling, stop the event:
dojo.stopEvent(evt);
}
});
위젯 인스턴스 외부에서 이 연결 작업을 수행하는 경우 this.connect를 사용하는 대신 widgetInstance.connect()를 사용하고 widgetInstance는 dijit.Dialog 인스턴스를 참조하는 변수라고 가정합니다.
해당 버전의 연결을 사용하면 위젯은 대화 상자 위젯이 삭제될 때 이벤트 핸들러를 자동으로 등록 취소하여 메모리 프로필을 확인합니다.
다른 팁
내가 찾은 한 가지 방법은 위젯에 지연 연결을 추가하는 것이었습니다.
dojo.connect(this.current_popup, "onDownloadEnd", function(){
dojo.query("a.popup",this.current_popup).forEach(function(node) {
// add your function add here
});
});
이는 ajax 호출이 완료된 후에 실행되므로 이제 DOM에서 객체를 찾을 수 있습니다.