有没有触发与道场捕获阶段(而不是冒泡阶段)的事件/上的方法吗?
Answer 1:
我在这里结束了寻找信息上的前身() - 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节点和你想连接到该事件的名称。 然后连接到它,您连接到我把它叫做“captureEventHandlers”的DOM节点上的自定义对象。 这是我在我做onload
处理程序。 我还做了正常dojo.connect
表明这并不醒目正常的泡沫事件干扰。
Answer 2:
是的,它是可能的,你可以使用方面。 http://livedocs.dojotoolkit.org/dojo/aspect
特别是前或周围)
之前
该模块还包括一个前函数这个建议的方法之前提供。 被称为主方法之前所提供的建议功能将被调用。 该功能之前的签名是:
before(target, methodName, advisingFunction);
文章来源: Dojo/on and the capture phase