2012-07-05 2 views
4

dojo/on을 사용하여 캡처 단계 (버블 링 단계) 대신 이벤트를 트리거 할 수 있습니까?Dojo/on 및 캡처 단계

+0

짧은 대답은 아니오입니다. 그러나 왜 캡처 단계에서 트리거하려고합니까? 어쩌면 이걸 성취 할 수있는 다른 방법이 있습니다. – Dancrumb

답변

-2

예, 가능합니다. http://livedocs.dojotoolkit.org/dojo/aspect

특히 전이나 주위)

모듈은 또한 방법에 관한 조언 전에 제공하는 기능을 포함하기 전에

전에. 제공된 조언 기능은 주 메소드가 호출되기 전에 호출됩니다. 사전이 함수의 서명은 다음과 같습니다

before(target, methodName, advisingFunction); 
+0

이것이 도움이된다고 나는 생각하지 않습니다. AOP는 객체 메소드에 조언 메소드를 추가하기위한 것입니다. 정확히 어떤 방법을 권하고 싶습니까? – Dancrumb

+0

그가 위젯에서 "클릭"이벤트에 연결된다고 가정하면 그는 before (targetWidget, "onClick", function() {// 여기에서 원하는 모든 작업을 수행 할 수 있습니다. 예를 들어 소스, 대상 등을 확인하십시오 }); 왜 내가 downvote뿐만 아니라 사람이 원하는 것을 먼저 확인하지 않고도 허위 정보를 줄 것입니다 궁금해 ... 어쩌면 나는 그것 때문에 당신을 downvote해야합니까? – PEM

+1

'onClick'이 호출되기 전에 조언 방법이 호출되지만,'onClick'은 버블 링 단계까지 호출되지 않습니다. OP가 캡처 단계에서 이벤트 처리기를 트리거하는 방법을 명시 적으로 요청했기 때문에이 대답은 제기 된 질문을 전혀 다루지 않습니다. – Dancrumb

2

내가 여기에의 전임자에 대한 정보를 찾고 결국() - dojo.connect(). 가치가있는 경우 dojo.connect()는 캡처 단계에서 이벤트 리스너를 지원하지 않는 것으로 보입니다. DOM 노드에 이벤트 핸들러를 필드로 추가하여 작동합니다 (예 : node["mouseclick"] = ...). 캡처 단계에서 이벤트를 수신하려면 addEventListener를 사용해야하므로 dojo.connect()가 수행 할 수 없다는 점이 다릅니다.

dom 노드의 사용자 정의 객체에 이벤트 리스너를 추가 한 다음 해당 핸들러에서 dojo.connect()를 사용하면됩니다.

<html> 
<head> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/dojo/1.6.1/dojo/dojo.xd.js.uncompressed.js"></script> 
    <script type="text/javascript"> 
     function forwardCaptureEvent(e) { 
      var listener = this.captureEventHandlers[e.type]; 
      if (listener != null) listener.apply(this, arguments); 
     } 

     function enableCaptureEvent(domNode, eventType) { 
      if (domNode.captureEventHandlers == null) domNode.captureEventHandlers = {}; 
      var evtHandlers = domNode.captureEventHandlers; 
      if (evtHandlers[eventType] == null) evtHandlers[eventType] = function(e) {}; 
      domNode.addEventListener(eventType, forwardCaptureEvent, true); 
     } 

     function logEvent(label, e) { 
      dojo.byId("log").innerHTML += label + " " + e.currentTarget.id + " " + e.type + " " + [ '', 'capturing', 'target', 'bubbling' ][ e.eventPhase ] + "<br/>"; 
     } 

     function logCaptureEvent(e) { 
      logEvent("capture phase:", e); 
     } 

     function logBubbleEvent(e) { 
      logEvent("bubble phase:", e); 
     } 

     window.onload = function() { 
      enableCaptureEvent(dojo.byId("test"), "click"); 
      dojo.connect(dojo.byId("test").captureEventHandlers, "click", logCaptureEvent); 
      dojo.connect(dojo.byId("test"), "click", logBubbleEvent); 
     } 
    </script> 
</head> 
<body> 
    <div id="test" style="background: darkorange; padding: 20px;"> 
     <div style="background: gold; padding: 20px;"> 
      <div style="background: cornsilk; ">Click me.</div> 
     </div> 
    </div> 

    <div id="log"></div> 
</body> 
</html> 

그래서 여기 enableCaptureEventforwardCaptureEvent 내 도우미 기능입니다. enableCaptureEvent은 내가 말하고있는 DOM 노드에서 캡처 이벤트 리스너의 사용자 정의 객체를 만든 다음 실제로 캡처 이벤트를 수신하여이 수신기에 전달하기 위해 forwardCaptureEvent을 사용합니다.

이러한 헬퍼를 사용하려면 enableCaptureEvent에 DOM 노드와 연결하려는 이벤트의 이름이 필요합니다. 그런 다음 연결하기 위해 "captureEventHandlers"라는 DOM 노드의 사용자 정의 객체에 연결합니다. 이것이 내가 onload 처리기에서 수행하고있는 작업입니다. 나는 정상적인 버블 이벤트를 잡는 것을 방해하지 않는다는 것을 보여주기 위해 정상적인 dojo.connect을 수행하고 있습니다.