有没有办法在捕获阶段(而不是冒泡阶段)用dojo/on触发事件?
sczxawaw1#
我来这里是为了寻找on的前任的信息()- dojo.连接().不管它值多少,dojo.connect()似乎不支持捕获阶段的事件侦听器。它的工作原理是将事件处理程序作为字段添加到DOM节点中,例如node["mouseclick"] = ...由于在捕获阶段必须使用addEventListener来接收事件,我的推论是dojo.connect()无法做到这一点。您可以做的是向DOM节点上的自定义对象添加一些事件侦听器,然后在那些处理程序上使用Dojo.Connect()。
node["mouseclick"] = ...
<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实际接收捕获事件并将其转发给这些侦听器。然后要使用这些helper,你用一个DOM节点和你想要连接的事件的名称调用enableCaptureEvent。然后要连接到它,你连接到DOM节点上的自定义对象,我称之为“captureEventHandlers”。这就是我在onload处理程序中所做的。我还做了一个普通的dojo.connect,以显示这不会干扰捕获普通的气泡事件。
enableCaptureEvent
forwardCaptureEvent
onload
dojo.connect
9cbw7uwe2#
是的,可以,您可以使用方面。http://livedocs.dojotoolkit.org/dojo/aspect尤指在前面或周围;)之前该模块还包括一个before函数,用于向方法提供before通知。所提供的通知函数将在主方法被调用之前被调用。before函数的签名为:
before(target, methodName, advisingFunction);
2条答案
按热度按时间sczxawaw1#
我来这里是为了寻找on的前任的信息()- dojo.连接().不管它值多少,dojo.connect()似乎不支持捕获阶段的事件侦听器。它的工作原理是将事件处理程序作为字段添加到DOM节点中,例如
node["mouseclick"] = ...
由于在捕获阶段必须使用addEventListener来接收事件,我的推论是dojo.connect()无法做到这一点。您可以做的是向DOM节点上的自定义对象添加一些事件侦听器,然后在那些处理程序上使用Dojo.Connect()。
这里
enableCaptureEvent
和forwardCaptureEvent
是我的辅助函数。enableCaptureEvent
在DOM节点上创建捕获事件侦听器的自定义对象,然后使用forwardCaptureEvent
实际接收捕获事件并将其转发给这些侦听器。然后要使用这些helper,你用一个DOM节点和你想要连接的事件的名称调用
enableCaptureEvent
。然后要连接到它,你连接到DOM节点上的自定义对象,我称之为“captureEventHandlers”。这就是我在onload
处理程序中所做的。我还做了一个普通的dojo.connect
,以显示这不会干扰捕获普通的气泡事件。9cbw7uwe2#
是的,可以,您可以使用方面。http://livedocs.dojotoolkit.org/dojo/aspect
尤指在前面或周围;)
之前
该模块还包括一个before函数,用于向方法提供before通知。所提供的通知函数将在主方法被调用之前被调用。before函数的签名为: