有没有办法使用 dojo/on 在捕获阶段(而不是冒泡阶段)触发事件?
2 回答
我最终在这里寻找有关 on() 的前身 - 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
用于实际接收捕获事件并将它们转发给这些侦听器。
然后要使用这些帮助程序,您需要enableCaptureEvent
使用 DOM 节点和要连接的事件的名称进行调用。然后连接到它,你连接到 DOM 节点上的自定义对象,我称之为“captureEventHandlers”。这就是我在onload
处理程序中所做的。我也在做一个正常dojo.connect
的显示这不会干扰捕捉正常的气泡事件。
是的,有可能,您可以使用方面。 http://livedocs.dojotoolkit.org/dojo/aspect
尤其是之前或前后;)
前
该模块还包括一个 before 函数,它为方法提供之前的建议。提供的通知函数将在调用 main 方法之前被调用。before 函数的签名是:
before(target, methodName, advisingFunction);