2011-03-16 18 views
2

$(document).bind()を介してページの各要素にバインドされたイベントハンドラがあります。

誰かが特定の要素に対してこのハンドラをアンバインドする方法を知っていますか?ここで

は、私が望むように動作しません、私のサンプルコードです:ここにダニエルの答えを考える

<html><head> 
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.js"> </script> 
</head> 
<body> 
    <div id="mid" style="cursor:pointer" >click me</div> 
    <div>sample</div> 
    <script type="text/javascript"> 
     var fun = function() { 
      alert('default handler'); 
     }; 
     $(document).bind('click.custom', fun); 
     //trying to unbind the handler but it remains there 
     $("#mid").unbind('click.custom'); 
    </script> 
</body> 
</html> 

は再びこの問題である:

var ff = function() { 
    alert('additional'); 
} 

$(document).bind('click.custom', fun); 
$(document).bind('click.custom2', ff); 
$("#mid").bind('click.custom', false); 

ここで楽しいイベントハンドラはから完全に結合していないました#mid要素ですが、ffイベントハンドラもアンバインドされていましたが、それは私の問題です。

答えて

1

イベントバブリングと呼ばれる。ネストされた要素のイベントは親に送られます。

あなたはbindから#midになり、そのハンドラからfalseを返す必要があります。

+0

これはうれしいです、ありがとうございます。ハンドラからfalseを返すと、ハンドラが他の名前空間にリセットされます。特定の名前空間からハンドラだけをアンバインドする方法はありますか?他のハンドラはそのままですか? – exodus

0

文書にバインドされているイベントは1つだけです。バブリングのため、イベントは伝播が停止するまで、またはドキュメントに到達するまで、DOM階層の上に送信されます。

#midのコールバックを変更するか、組み込みのデリゲート/ライブを使用して同じ効果を達成することができます。

$(document).delegate('[id!="mid"]', 'click.custom', fun); 

これは、idが "mid"の要素からのイベントを無視します。もう1つの方法は、関数自体を変更することです。

function fun() { 
    if (this.id == "mid") { 
     return; // if event came from #mid, ignore it. 
    } 
    // continue processing as normal 
} 
+0

コールバック関数を変更することは、望ましい結果を得るための正しい方法です。私はそれについて考えましたが、私のプロジェクトでは、初期バインディングプロセスまたはコールバック関数を変更する権限がありません。そしてそれは物事を本当に困難にします。しかし、すべてのあなたの答えは私の元の質問に完璧なので、ありがとう男。 – exodus

+0

イベント作成プロセスを制御できない場合は、元のイベントハンドラ関数をjQueryから取得し、それを外部関数内にラップすることができます。次に、この外部関数の特定の要素を無視するロジック。 jQueryが知っている限り、何も変わっていません。 – Anurag

関連する問題