ンンンパ

ふとしです

移転しました

.on で namespace つきの eventType を登録する

JQuery を HTMLElement セレクターとしてしか使えてなかったので、勉強になるだろうと bootstrap.js を読んでいる(そのまえにドキュメント全部読めばって話ではある)。知らなかった使い方があればメモ。

.on で namespace つきの eventType を登録する

同じ eventType に登録された複数のイベントリスナーのうち特定のものをはがしたい場合、unbind(eventType) でははがしたくないものもはがされるので、関数へのリファレンスを保持しておく必要がある。

var handler1
, handler2
, $test1 = $('#TEST1')
, $test2 = $('#TEST2');

$test1.on('click', function (e) {
   console.log('always 1');
});
$test2.on('click', function (e) {
   console.log('always 2');
});

$test1.on('click', handler1 = function (e) {
   console.log('test 1');
   $test2.unbind('click', handler2);
});
$test2.on('click', handler2 = function (e) {
   console.log('test 2');
   $test1.unbind('click', handler1);
});

handler1 とか handler2 がそれで、関数自身で自分をはがす場合は arguments.callee を使えなくもないが(悪手らしい)、ほかのイベントリスナーをはがそうとすると手がかりがない。

そこで namespace を使う。

var $test1 = $('#TEST1')
, $test2 = $('#TEST2');

$test1.on('click.test.always', function (e) {
   console.log('always 1');
});
$test2.on('click.test.always', function (e) {
   console.log('always 2');
});

$test1.on('click.test.test', handler1 = function (e) {
   console.log('test 1');
   $test2.unbind('click.test.test');
});
$test2.on('click.test.test', handler2 = function (e) {
   console.log('test 2');
   $test1.unbind('click.test.test');
});

e.type でひくと click が返る一方で unbind などでは区別されているので、unbind('click.test.test') とした場合 click.test.always ははがされずに残る。unbind('click.test') だとどちらも消える。

はがす予定のイベントリスナーにはわざわざメンバー変数などを用意していたのですが、これならその手間がはぶけてとても便利ですね。