Dojo/on和捕获阶段

0ve6wy6x  于 2022-12-16  发布在  Dojo
关注(0)|答案(2)|浏览(109)

有没有办法在捕获阶段(而不是冒泡阶段)用dojo/on触发事件?

sczxawaw

sczxawaw1#

我来这里是为了寻找on的前任的信息()- dojo.连接().不管它值多少,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实际接收捕获事件并将其转发给这些侦听器。
然后要使用这些helper,你用一个DOM节点和你想要连接的事件的名称调用enableCaptureEvent。然后要连接到它,你连接到DOM节点上的自定义对象,我称之为“captureEventHandlers”。这就是我在onload处理程序中所做的。我还做了一个普通的dojo.connect,以显示这不会干扰捕获普通的气泡事件。

9cbw7uwe

9cbw7uwe2#

是的,可以,您可以使用方面。http://livedocs.dojotoolkit.org/dojo/aspect
尤指在前面或周围;)
之前
该模块还包括一个before函数,用于向方法提供before通知。所提供的通知函数将在主方法被调用之前被调用。before函数的签名为:

before(target, methodName, advisingFunction);

相关问题