有沒有辦法在dojo/on的捕獲階段(而不是冒泡階段)觸發事件?Dojo/on和捕獲階段
回答
是的,這是可能的,你可以使用方面。 http://livedocs.dojotoolkit.org/dojo/aspect
尤其之前或周圍)
之前
該模塊還包括一個前函數忠告 的方法之前提供。提供的建議功能將在 主要方法被調用之前調用。該功能之前的簽名是:
before(target, methodName, advisingFunction);
我不相信這會有所幫助。 AOP用於將建議方法添加到對象方法。準確地說,你會建議在這裏建議哪種方法? – Dancrumb
假設他會連接到某個小部件上的「點擊」事件,他可以在之前使用(targetWidget,「onClick」,function(){//他希望在這裏做的仇恨,例如檢查源,目標或任何}); 我想知道爲什麼你不但不會首先確定這個人想要的是什麼,而且還會提供虛假的信息......也許我也應該爲了它而低估你? – PEM
建議方法將在調用onClick之前調用,但onClick不會在冒泡階段調用。由於OP明確要求在捕獲階段觸發事件處理程序,所以此答案根本不涉及提出的問題。 – Dancrumb
我在這裏結束了尋找信息上的前身() - 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>
所以在這裏enableCaptureEvent
和forwardCaptureEvent
是我的輔助功能。 enableCaptureEvent
在我正在討論的DOM節點上創建捕獲事件偵聽器的自定義對象,然後forwardCaptureEvent
用於實際接收捕獲事件並將它們轉發給這些偵聽器。
然後,要使用這些助手,請使用DOM節點和要連接的事件的名稱調用enableCaptureEvent
。然後連接到它,連接到我稱爲「captureEventHandlers」的DOM節點上的自定義對象。這就是我在onload
處理程序中所做的。我也正在做一個正常的dojo.connect
來表明這不會影響捕捉正常的氣泡事件。
- 1. 設置捕獲階段
- 2. 彙編中的聲明捕獲階段
- 3. 事件階段 - flex中的捕捉階段
- 4. 獲取Libgdx階段
- 5. Libgdx階段和表
- 6. 如何在捕獲/冒泡階段之間延遲
- 7. 如何在啓動階段捕獲屏幕(當Autochk運行時)?
- 8. stopPropgation是否停止在捕獲階段傳播事件?
- 9. Android:如何在rndis初始化階段捕獲網絡包?
- 10. 如何在捕獲階段觸發自定義事件
- 11. 當捕獲和冒泡階段調用處理函數時,event.target是什麼?
- 12. 使用掃描儀和JavaFX階段獲取鍵盤輸入階段
- 13. 恢復的三個階段:分析階段,重做階段和最終撤銷階段
- 14. 捕獲階段與氣泡階段 - 爲什麼下面的代碼不會產生相同的結果?
- 15. shuffle和sort階段是map還是reduce階段?
- 16. 瞭解執行階段和渲染階段
- 17. 調試標誌和GCC(編譯階段/鏈接階段)
- 18. 在事件捕獲階段綁定jQuery處理程序(不是事件冒泡)
- 19. e.preventDefault();但我們如何防止捕獲階段進一步下降到兒童
- 20. 派遣活動在捕獲/泡沫週期的哪個階段開始?
- 21. 獲取階段從容器中kineticjs
- 22. CRM獲得階段必填項
- 23. 如何獲得當前活躍階段?
- 24. 排序階段
- 25. Azure - 在階段
- 26. 來自階段
- 27. UVM階段singletons
- 28. maven包階段
- 29. 如何在其父階段爲fullScreenMode時將階段製作爲Aplication_Modal階段?
- 30. R:GSUB和捕獲
簡短的回答是否定的;然而,你爲什麼試圖在捕捉階段觸發?也許有另一種方法來實現這個 – Dancrumb