2012-05-07 11 views
5

他の要素で処理されていない場合にのみマウスイベントを処理したいスクリプトを作成しています。他の要素で処理されていないJavascriptイベントの処理

私はドキュメントリスナーをドキュメントオブジェクトに添付できますが、すでに処理されているかどうかにかかわらずすべてのイベントを受信します。

HTMLページの要素を制御できないため、イベントを処理するときに手動でstopPropagation()を実行することはできません。

アイデア?

+1

あなたがコントロールしていないクリックイベントはどのようにバインドされていますか? –

+0

これは別の種類のページで使用できるライブラリの一部なので、私は本当に分かりません。 addEventListenerまたはonXXXにすることができます。 – Grodriguez

+1

ええ、 'addEventListener'はそれをより困難にします。 on [event]型では、ドキュメントにバインドされたハンドラが 'e.target'で始まり、ハンドラを持つハンドラを調べるためにそのハンドラとその祖先をテストし、それを呼び出し関数でラップすることができます'stopPropagation'です。しかし、 'addEventListener'はあなたにそれをさせません。 –

答えて

1

<div id='asdf'>asdf</div>​ 

はJavaScript:ここで(jsFiddle付き)概念実証

ターゲットHTMLです。

これはまだできていないようです。

どのイベントハンドラが登録されていますか?

W3Cのイベント登録 モデルの現在の実装の1つの問題は、イベントハンドラがすでに に登録されているかどうかを確認できないことです。あなたが行うことができ、従来のモデルでは:

alert(element.onclick)

、あなたは何も登録されていない場合 こと、または未定義に登録されています関数を参照してください。唯一のそのごく最近のDOM レベル3のイベントにW3Cは、現在の要素に登録されているイベント ハンドラのリストを格納するために

eventListenerList

を追加します。 この 機能はまだすべてのブラウザでサポートされていません、それは新しいです。 しかし、問題が解決されました。

幸い

removeEventListener() 

削除したいイベント リスナーはあなたがいつもにremoveEventListenerを使用することができるとき 疑いで、要素に追加されていない場合にエラーを与えるものではありません( )。

+0

OK(ただし、リスナーのリストは必要ありません)。私は他の方法を見つけることができるか見てみましょう。 – Grodriguez

1

このように、特定の状況下で必要なものを達成できます。具体的には、

  • 場合は、何をやっていることは、元のを置き換えるで、あなたが他の人が効果的に

にイベントをスローするためにあなたが聴いている要素を知る元

  • 前に、独自のカスタムJavaScriptを読み込むことができます呼び出しをインターセプトし、特別な処理を行い、通常通りに続行させるカスタム要素を持つターゲット要素のaddEventListenerメソッド。この '特別処理'は元のコールバックをラップする新しい関数で、イベントの引数に何らかの状態を付けて、他の誰かが既にイベントをハンドリングしたことを知らせます。この記事hereから

    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); 
    }) 
    
  • +0

    これは興味深い考えです。自分のJSがオリジナルより前に実行されるようにすることができます。しかし、どの要素がイベントリスナーを追加するのかわからない。これを行う方法はありますか?グローバルな方法ですか? (つまり、addEventListenerコードを変更されたバージョンでグローバルに置き換えます) – Grodriguez