jQuery日本語リファレンス

jQuery does not mean Japanese Query...

Namespaced Events

jQueryは、イベントの実行や削除を容易にするために、イベントに名前空間を持たせるシステムを実装しています。


イベント処理の問題点

通常、イベントへのコールバック関数登録は次のように行います。
$('.class').bind('click', function(){});
しかしながら、ここには問題があります。
時に、ある特定の関数や、関数グループ(例えばあるプラグインで提供されている関数群)を取り除きたい場合などです。

残念ながら、unbindでは全ての関数が削除されてしまいます。
$('.class').unbind('click');
この場合、例えばプラグインで使う関数群をひとつのハンドラにまとめ、それを登録するようなテクニックを使うこともできます。
function handler(){
  myFunc1();
  myFunc2();
  ...
}
$('.class').bind('click', handler);
$('.class').unbind('click', handler);
しかしこの処理であれば削除時まで関数への参照が手元に残っていなければなりません。
これは無名関数を頻繁に用いるコーディングでは煩雑であり、いつも可能というわけではありません。

解決策:Namespaced Events (名前空間付きイベント)

そこでjQueryでは、Namespaced Eventsと呼ばれるコンセプトを打ち出しました。
使い方は簡単に、イベント名にクラス名のような要領で名前空間を付けてやるだけです。
これによって、この名前空間でunbindtriggerを操作することが出来ます。
$('.class').bind('click.namespace', function(){}); 
$('.class').trigger('click.namespace');
$('.class').unbind('click.namespace');
名前空間付きのイベントは、それぞれの名前空間でunbindやtriggerを行われ、名前空間指定の無い場合には通常通り「全ての関数」として扱われます。
$('.class').bind('click.namespace', function(){}); 
$('.class').trigger('click.namespace'); // namespace名前空間だけ
$('.class').trigger('click');           // 全ての関数
$('.class').trigger('click.other');     // otherだけ
上記例では、最初にbindした関数は最初のtriggerと2番目のものでは実行され、最後のものでは実行されません。

名前空間は、例えばAjax通信後に作られた要素へのイベント再定義などにも役立つでしょう。
$('.class')
  .unbind('click.namespace')
  .bind('click.namespace', function(){});
ただし、このような処理はjQuery 1.3以降であればliveイベントによる実装を検討した方が良いかもしれません。

jQuery 1.3からは更に、複数の名前空間へ同時に設定することが出来るようになりました。例えば次のように記述します。
$('.class').bind('click.a.b', function(){}); 
$('.class').trigger('click.a');
$('.class').unbind('click.b');