2013-06-14 6 views

答えて

6

あなたはプレーンなJavaScriptで処理する独自のイベントをやっている場合、あなたはおそらくすでにクロスブラウザのルーチンを持っていますイベントハンドラを設定します。その関数に抽象化を置くことができます。ここで私が使用している一つだその模倣jQueryの機能(イベントハンドラはfalseを返した場合、両方のstopPropagation()preventDefault()がトリガされているあなたは、明らかに、しかし、それを修正することができますが、それが動作するようにしたい:あなただけのことができ、

​​

しますか、このようなユーティリティ機能を行います。

function stopPropagation(e) { 
    if(e.stopPropagation) { 
     e.stopPropagation(); 
    } else { 
     e.returnValue = false; 
    }  
} 

そして、ちょうど代わりに、各機能のイベント上で動作する、その関数を呼び出すを

+0

ちょうど私は明確です...あなたはfn.callを使用すると実際にイベントハンドラに渡された関数を起動していないですか?どのように、なぜそれが偽になるのか、私が理解しているのか分からないのですか?イベントハンドラがevent.stopPropagationを使用しない場合はどうなりますか? – ryandlf

+0

もう一つだけ。私はリターン使用ブラケットを見たことがない。好奇心の外に、それはリターンretとは異なるものです; – ryandlf

+0

@ryandlf - はいfn.callはカスタムイベントハンドラ関数( 'addEvent()'で渡されたイベントハンドラ関数を呼び出しています)特定のイベントの 'stopPropagation()'を実行するには、あなたのイベントハンドラ関数で 'return false'を返します。そうでない場合は、イベントハンドラ関数が伝播を停止するかどうかを決めることになります。これはjQueryが使用するモデルです – jfriend00

7

おそらくこの:

Event = Event || window.Event; 
Event.prototype.stopPropagation = Event.prototype.stopPropagation || function() { 
    this.cancelBubble = true; 
} 

returnValue = falseがでpreventDefaultための類似体である:

Event.prototype.preventDefault = Event.prototype.preventDefault || function() { 
    this.returnValue = false; 
} 
+0

私はポスターへのリンクを投稿してこの方法について言及しましたが、別の答えを受け入れました。彼はjsFiddle経由で動作していないと言います。だから私はこのメソッドに心配していた... – ryandlf

-1

私たちは、これだけを使用することができます:event.cancelBubble = true

すべてのブラウザで動作確認済みです。