2017-01-28 5 views
0

[編集:シナリオの詳細を追加]window.addEventListenerで作成したイベントハンドラをプリエンプトする方法はありますか?

私はアプリがスクリプトタグを使用して含めることができるツールを作成しています。このツールはアプリにオーバーレイを追加します。そのオーバーレイにはキャンバスとキャンバスにレンダリングするコントロールが含まれています。私はツールがすべての入力イベントをキャプチャして(レンダリングされたコントロールのいずれかで発生した場合)それらを処理し、アプリケーションへの伝播を停止するか、またはそれらをアプリケーションに渡すことができるようにしたいと思います(レンダリングされたコントロール)。

私は次のようにアプリは、キャプチャを使用して、ウィンドウ上のイベントを登録する場合を除き、ホストアプリケーションの入力イベントのすべてを先取りすることができる午前:

window.addEventListener("mousedown", (e) => console.log("hi"), true); 

は、その機能を注入するための私のツールのための方法はありますそれ以前に呼び出されますか?

+0

あなたは何をしようとしているのか、より具体的にすることはできますか?私がなぜ '注入 '関数を' console.log'の前にコールバック関数で呼び出すことができないのかはわかりませんでした。 – mrlew

+0

確かに;私はタグを使ってjavascriptアプリに含めることができるツールを書いています。このツールは、DOMにキャンバスを追加することによって、アプリケーションのオーバーレイを提供します。私はツールがオーバーレイのレンダリングされたボタンの1つをクリックすると、私は伝播をキャンセルできるように、アプリケーションがそれらを取得する前に、すべての入力イベントをインターセプトできるようにしたいと思います。しかし、アプリケーションがキャプチャを使用してウィンドウにイベントを登録すると、アプリのコールバックの「前に乗る」方法を理解できません。 (編集:分かりやすくするために - 私のツールではなく、上記のイベントを追加するのはホストアプリケーションです) –

答えて

1

いいえイベントリスナーがキャプチャフェーズのwindowにアタッチされている場合は、他のリスナーを先に取得する方法がありません。これは、windowがイベントの通知を受ける最初のノードになり、リスナーが追加された順序でトリガーされるためです。 (これは、あなたが使用しているツールのデザイナーが意図的に行ったと思います。エンドユーザフレンドリーなIMOではありません)。

唯一の方法は、この場合、removeEventListenerを使用し、独自のリスナーを追加して、元のリスナーを再バインドすることができます。しかし、これはあなたのコードでは起こりそうにないようです。

+0

私のコードにはオプションがありません。不可能なことを明確にすることは役に立ちます。誰かが不可能な答えを思い付くまで、これを答えとしてマークする:)。どうも! –

1

ページの最初に表示するには、スクリプトタグの1つが必要です(理想的には<head>)。その後、まずリスナーを接続します。

+0

ありがとうございます - 私はホストアプリケーションにスクリプトが含まれている場所を制御することはできませんが、私はスクリプトを含む開発者にその指針を提供することができます。 –

関連する問題