2012-01-07 6 views
3

私はさまざまなイベントのボタンがたくさんあります。ページ上で(ほとんどの)イベントを無効にしますか?

アプリが「スーパー」モードになっているときは、これらのすべてのイベントを無効にする必要がありますが、そのうちの2〜3つをアクティブに保つ必要があります。

このようなことを行うにはどうすればよいでしょうか?すべてのハンドラをバインド解除する必要がありますか、デフォルトの動作を妨げるイベントをスーパーにすることはできますか?

答えて

1

試して....

コード上記
$(":button").unbind("click mouseover mouseout"); 

は、引数なしでunbindを呼び出して、すべてのボタンに指定されたイベントをアンバインドしますが、ページ上のすべてのボタン上のすべてのイベントをアンバインドします

+0

そしてすべてのハンドラを再バインドしますか?それは私が可能なら回避しようとしていることです。私はイベントをバインド解除できることを知っています... – fancy

0
/* Store Old Events */ 
var ClickEvents = $("#MyButton").data("events")["click"]; 
var OldEvents = new Array(); 
/* we have to do this because ClickEvents is a reference to the click events obj and gets modified on the unbind call below */ 
for(i in ClickEvents) 
{ 
    OldEvents.push(ClickEvents[i]); 
} 
$("#MyButton").unbind("click"); 

/* Set Binds For "Super" */ 
$("#MyButton").click(function(){ alert("new bind");}); 
/* Reset old events when not "Super" */ 
$("#MyButtno").unbind("click"); 
for(i in OldEvents) 
{ 
    $("#MyButton").click(OldEvents[i]); 
} 

変更どのようなイベントでも操作したいところに「クリック」する

「スーパー」モード用に別のボタンを作成するだけで簡単にできます。スーパーではなく、スーパーにいないときに戻してください。また、あなただけのいくつかのイベントを(アンバインド)を無効にし、いくつかを保つため、異なる名前空間

にそれらを分離する場合

例:

$("#MyButton").bind("click.SuperBinds",function() 
{ 
    alert("a super bind"); 
}); 

$("#MyButton").bind("click.RegularBinds",function() 
{ 
    alert("a regular bind"); 
}); 

/*disable regular binds, and keep SuperBinds click events*/ 
$("#MyButton").unbind("click.RegularBinds"); 
4

私は単に無効にする方法を認識していないよと後であなたが尋ねているように自動的にページ上のすべてのイベントを(ほぼ)再有効にします。

しかし、その最終結果を達成するための2つの非常に簡単な技術は以下のとおりです。

  1. バインド解除し、後で再バインドします。バインディングがたくさんあると面倒ですが、面倒なように聞こえるかもしれませんが、バインディングコードを関数に入れ、バインドされていないコードを別のコードに入れた場合、これらの関数を呼び出すだけですあなたはコードが重複していません。おそらく最初のjQueryセレクタの結果を変数にキャッシュする必要があります。これは、もともとセレクタに一致した要素のみをアンバインドして再バインドできるようにするためです(たとえば、クラスによって最初に選択した場合クラスは後で削除される可能性があります)。

  2. フラグを設定し、何かをする前にすべてのイベントハンドラにそのフラグをチェックさせます。

このような単純な何かが作品:

var eventsDisabled = false; 

$("some selector").on("some event", function() { 
    if (eventsDisabled) return; 
    // actual event handling code here 
} 

// in some other part of your code: 
eventsDisabled = true; // turn off all events 

明らかにこれに欠点は、あなたがしたいことを、いくつかを除いて、すべてのイベントハンドラの先頭に余分な行を追加する必要があります常にアクティブなままですが、それはちょうど3つの単語といくつかのカッコです...

関連する問題