2011-08-17 3 views
11

jQueryの.live()機能を使用して)clickイベントをリンクにバインドし、純粋なJSとHTML(<a href="".... onclick="some action">など)でonclickイベントハンドラーを手動で追加します。私はliveメソッドへのイベントのバブリングを防止したいが、私はどのようにわからない。jQueryを使用しないstopPropagation

多分e.stopPropagation()がこの状況で役立ちますが、onclickで追加されたイベントハンドラは純粋なJSで書かれており、stopPropagation()をjQuery要素ラッパーの外から呼び出すことはできません。この場合のreturn falseは機能しません。私はreturn false$.Event('click').stopPropagation()と置き換えようとしましたが、これはうまくいかなかったと思います。

jQueryラッパーを使わずにlive()メソッドへの書き込みを防止する方法は?

答えて

2

.liveでは、伝播を停止できません。これは、.liveでは、イベントハンドラがDOMツリーのルートにバインドされているためです。したがって、イベントは、ハンドラを呼び出す前に最高の要素までバブルする必要があります。そのうちの1つは.liveを使用しています。

.delegate(ハンドラを保持したい場合)を使用するか、代わりに.bindを使用することを検討してください。あなたは、ライブハンドラはcompletly無効にすることにしたい金型を使用する場合

$("#myHref").die("click", aClick); // this will remove any existing event handlers 
$("#myHref").click(yourhandler); // add your handler 

Demo 1: JsFiddle 1

かを、インラインハンドラを追加(そしてそこからイベントをキャンセル):

<a href=".." onclick="yourhandler"> 

Demo 2: JsFiddle 2

インラインハンドラはb jqueryイベントハンドラの前に常に最初に呼ばれる。

+0

.liveでバインドするコードは変更できません。これを修正する方法はありませんか? – abonec

+0

しかし、要素にバインドされた別のイベントハンドラからイベントを停止することは可能です。 –

+0

そのイベントハンドラが最初に登録されている場合のみ。 jQueryはそれらをキューに入れます。 – Mrchief

13

"正常な"イベントハンドラではreturn falseがイベントのバブリングを防止すると仮定していましたが、but I was wrong(ありがとう@Mrchief)です。

function doSomething(e) 
{ 
    if (!e) var e = window.event; 
    e.cancelBubble = true; 
    if (e.stopPropagation) e.stopPropagation(); 
} 

cancelBubble

は、IEのすべてのW3C互換性のあるブラウザで stopPropagation作品です: quirksmode.orgに説明するように

は、しかしそれを停止する他の方法があります。

+0

でも、私は数週間前にそれを学んだ! – Mrchief

+0

イベント(onclick "alert(window.event)")に関する情報を取得しようとすると、クリックすると警告が表示されます。 – abonec

+1

@Abonec: 'window.event'はIE(およびChrome)でのみ利用可能です。他のブラウザでは、イベントオブジェクトはパラメータとしてイベントハンドラに渡されます。 –

関連する問題