4

dojo/on を使用して、キャプチャ フェーズ (バブリング フェーズではなく) でイベントをトリガーする方法はありますか?

4

2 に答える 2

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>

これが私enableCaptureEventforwardCaptureEventヘルパー関数です。enableCaptureEvent私が話していたDOMノード上にキャプチャイベントリスナーのカスタムオブジェクトを作成し、forwardCaptureEvent実際にキャプチャイベントを受信して​​、これらのリスナーに転送するために使用されます。

次に、これらのヘルパーを使用するにenableCaptureEventは、DOMノードと接続するイベントの名前を使用して呼び出します。次に、それに接続するには、「captureEventHandlers」と呼ばれるDOMノード上のカスタムオブジェクトに接続します。これは私がonloadハンドラーで行っていることです。私はまた、dojo.connectこれが通常のバブルイベントのキャッチを妨げないことを示すために通常のことをしています。

于 2012-10-19T18:40:35.170 に答える
-2

はい、可能です。アスペクトを使用できます。 http://livedocs.dojotoolkit.org/dojo/aspect

特に前後に;)

このモジュールには、メソッドに before アドバイスを提供する before 関数も含まれています。提供されたアドバイス関数は、メイン メソッドが呼び出される前に呼び出されます。before 関数のシグネチャは次のとおりです。

before(target, methodName, advisingFunction);
于 2012-07-05T09:38:14.167 に答える