$.fn.〜で選択したセレクタ利用して、.live()を実現

昨日『jQueryで選択したセレクタをハンドラ内で確認』というエントリーを書いたのですが、これを使えば独自メソッド内でliveのイベントを付けたい時にセレクタを簡単に使えると思ったので、昨日に続きメモエントリー。
.live(function(){})は$(document).on('Event','Selector',function(){})
jQuery 1.7での.live()は.on()に統合されています。同じように書くには、
$(document).on('Event','Selector',function(){
//何か処理
});
この様に書く必要があります。
$.fn.◯◯〜のようなプラグインを作成して、プラグイン内部で.live()を使わずに.on()で同様の機能を得るためには、選択しているセレクタを書き入れる必要があります。そのため、利用しているセレクタの文字列が必要になったのです。
では簡単に、クリックした要素のテキストをアラートで表示するプラグインを書いてみましょう。
(function($){
$.fn.alertSelector = function(){
$(document).on('click',this.selector,function(){
alert($(this).text());
});
};
})(jQuery);
jQuery(function($){
$('#demo1 p').alertSelector();
//要素の追加
$('#demo1 button').on('click',function(){
$('<p>クリックでアラート表示(alert($(this).text());)</p>').appendTo('#demo1');
});
});
クリックでアラート表示(alert($(this).text());)
意図通りに、最初からあるp要素だけでなく、追加されたp要素でもアラートが出るようになっています。
これがベストな書き方かどうかはわかりませんが、とりあえずプラグインとしても動作します。
.live()ではなく、.delegate()での置き換えの場合、範囲を絞り込むセレクタをもう一つどこかに保持して、それを利用するようにする必要があります。ですが、今回は割愛しておきます。
.each()で作成してみる
では、今度はプラグインを.each()を使って作成してみます。
(function($){
$.fn.alertSelectorEach = function(){
return this.each(function(){
$(this).on('click',function(){
alert($(this).text());
});
});
};
})(jQuery);
jQuery(function($){
$('#demo2 p').alertSelectorEach();
//要素の追加
$('#demo2 button').on('click',function(){
$('<p>クリックでアラート表示(alert($(this).text());)</p>').appendTo('#demo2');
});
});
クリックでアラート表示(alert($(this).text());)
この書き方だと、最初からある要素ではアラートが表示されますが、追加した要素ではクリックしてもアラートがでません。
追加した要素にもイベントを付けておきたい場合などは、先程のような書き方をするのがよさそうです。
最後に
ちょっと前にもつぶやいたのですが、プラグインを作る上で、イベントを.live()や.delegate()でもたせておくのと、.each()で取得した要素のみにbindするのでは、どちらがいいのか現時点で把握できていません。もし使用する際は、そのへんは考えて作成するようお願いします。今回のが特別いい!という訳でもないので、ご理解ください。あくまでも、どのようにするかメモエントリー。
