他の要素で処理されていない場合にのみマウスイベントを処理したいスクリプトを作成しています。他の要素で処理されていないJavascriptイベントの処理
私はドキュメントリスナーをドキュメントオブジェクトに添付できますが、すでに処理されているかどうかにかかわらずすべてのイベントを受信します。
HTMLページの要素を制御できないため、イベントを処理するときに手動でstopPropagation()を実行することはできません。
アイデア?
他の要素で処理されていない場合にのみマウスイベントを処理したいスクリプトを作成しています。他の要素で処理されていないJavascriptイベントの処理
私はドキュメントリスナーをドキュメントオブジェクトに添付できますが、すでに処理されているかどうかにかかわらずすべてのイベントを受信します。
HTMLページの要素を制御できないため、イベントを処理するときに手動でstopPropagation()を実行することはできません。
アイデア?
:
<div id='asdf'>asdf</div>
はJavaScript:ここで(jsFiddle付き)概念実証
ターゲットHTMLです。
これはまだできていないようです。
どのイベントハンドラが登録されていますか?
W3Cのイベント登録 モデルの現在の実装の1つの問題は、イベントハンドラがすでに に登録されているかどうかを確認できないことです。あなたが行うことができ、従来のモデルでは:
alert(element.onclick)
、あなたは何も登録されていない場合 こと、または未定義に登録されています関数を参照してください。唯一のそのごく最近のDOM レベル3のイベントにW3Cは、現在の要素に登録されているイベント ハンドラのリストを格納するために
eventListenerList
を追加します。 この 機能はまだすべてのブラウザでサポートされていません、それは新しいです。 しかし、問題が解決されました。
幸い
removeEventListener()
削除したいイベント リスナーはあなたがいつもにremoveEventListenerを使用することができるとき 疑いで、要素に追加されていない場合にエラーを与えるものではありません( )。
OK(ただし、リスナーのリストは必要ありません)。私は他の方法を見つけることができるか見てみましょう。 – Grodriguez
このように、特定の状況下で必要なものを達成できます。具体的には、
にイベントをスローするためにあなたが聴いている要素を知る元
var target = document.getElementById('asdf');
var original = target.addEventListener;
var updated = function(){
// Grab the original callback, so we can use it in our wrapper
var originalFunc = arguments[1];
// Create new function for the callback, that lets us set a state letting us know it has been handled by someone
// Finish the callback by executing the original callback
var newFunc = function(e){
console.log('haha, intercepted you');
e.intercepted = true;
originalFunc.call(this, e);
};
// Set the new function in place in the original arguments 'array'
arguments[1] = newFunc;
// Perform the standard addEventListener logic with our new wrapper function
original.apply(this, arguments);
};
// Set the addEventListener on our target to our modified version
target.addEventListener = updated;
// Standard event handling
target.addEventListener('click', function(e){
console.log('original click');
console.log('intercepted?', e.intercepted);
})
これは興味深い考えです。自分のJSがオリジナルより前に実行されるようにすることができます。しかし、どの要素がイベントリスナーを追加するのかわからない。これを行う方法はありますか?グローバルな方法ですか? (つまり、addEventListenerコードを変更されたバージョンでグローバルに置き換えます) – Grodriguez
あなたがコントロールしていないクリックイベントはどのようにバインドされていますか? –
これは別の種類のページで使用できるライブラリの一部なので、私は本当に分かりません。 addEventListenerまたはonXXXにすることができます。 – Grodriguez
ええ、 'addEventListener'はそれをより困難にします。 on [event]型では、ドキュメントにバインドされたハンドラが 'e.target'で始まり、ハンドラを持つハンドラを調べるためにそのハンドラとその祖先をテストし、それを呼び出し関数でラップすることができます'stopPropagation'です。しかし、 'addEventListener'はあなたにそれをさせません。 –