2012-07-05 74 views
4

有沒有辦法在dojo/on的捕獲階段(而不是冒泡階段)觸發事件?Dojo/on和捕獲階段

+0

簡短的回答是否定的;然而,你爲什麼試圖在捕捉階段觸發?也許有另一種方法來實現這個 – Dancrumb

回答

-2

是的,這是可能的,你可以使用方面。 http://livedocs.dojotoolkit.org/dojo/aspect

尤其之前或周圍)

之前

該模塊還包括一個前函數忠告 的方法之前提供。提供的建議功能將在 主要方法被調用之前調用。該功能之前的簽名是:

before(target, methodName, advisingFunction); 
+0

我不相信這會有所幫助。 AOP用於將建議方法添加到對象方法。準確地說,你會建議在這裏建議哪種方法? – Dancrumb

+0

假設他會連接到某個小部件上的「點擊」事件,他可以在之前使用(targetWidget,「onClick」,function(){//他希望在這裏做的仇恨,例如檢查源,目標或任何}); 我想知道爲什麼你不但不會首先確定這個人想要的是什麼,而且還會提供虛假的信息......也許我也應該爲了它而低估你? – 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用於實際接收捕獲事件並將它們轉發給這些偵聽器。

然後,要使用這些助手,請使用DOM節點和要連接的事件的名稱調用enableCaptureEvent。然後連接到它,連接到我稱爲「captureEventHandlers」的DOM節點上的自定義對象。這就是我在onload處理程序中所做的。我也正在做一個正常的dojo.connect來表明這不會影響捕捉正常的氣泡事件。