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ノードと接続するイベントの名前を使用して呼び出します。次に、それに接続するには、「captureEventHandlers」と呼ばれるDOMノード上のカスタムオブジェクトに接続します。これは私がonload
ハンドラーで行っていることです。私はまた、dojo.connect
これが通常のバブルイベントのキャッチを妨げないことを示すために通常のことをしています。
はい、可能です。アスペクトを使用できます。 http://livedocs.dojotoolkit.org/dojo/aspect
特に前後に;)
前
このモジュールには、メソッドに before アドバイスを提供する before 関数も含まれています。提供されたアドバイス関数は、メイン メソッドが呼び出される前に呼び出されます。before 関数のシグネチャは次のとおりです。
before(target, methodName, advisingFunction);