覚えたてのjQueryを使っていて、「click()?.on?なにが違うんだ」と、とても気になったので、まとめました。
この記事を読んで理解できること
- .on,bind(),live(),delegate()の違いが理解できる。
1.onの有用性
- onひとつでbind(),live(),delegate()を表せる
bind()
- 基本的なイベントの設定
- 後から追加した要素に対しては利用できない
$('p').bind('click', function(){
//処理
});
$('p').unbind('click');
onを使うと、
$('p').on('click', function(){
//処理
});
$('p').off('click');
delegate()
- 後から追加した要素に対してもイベントを実行できる
- イベントの設定は親の要素に対して行う。
$('.parent').delegate('foo', 'click', function(){
//処理
});
$('p').undelegate('foo', 'click');
onを使うと、
$('.parent').on('foo', 'click', function(){
//処理
});
$('p').off('foo', 'click');
live()
- delegate()と同じく、後から追加した要素に対しても実行できる。
- イベントを設定するイベントの対象が、documentになる。
$('p').live('click', function(){
//処理
});
$('p').die('click');
onを使うと、
$('document').on('click', function(){
//処理
});
$('document').off('click');
delegateとliveは何をしているの?
bindを利用するとページ表示時にすでに存在する要素に対してイベントを設定する。その為、後から追加された要素にはイベントが設定できない。
例えば、<div>></div>
の要素の中に<p></p>
の要素を追加したとすると、
$('p').bind('click', function(){
//処理
});
このようにbindで記述してもクリックイベントは実行できない。
$('div').delegate('p', 'click', function(){
//処理
});
と親要素のdivにイベントを設定することで、間接的にイベントを設定する事ができる。
liveとdelegateの違いは、delegateの中にliveが含まれていると考えると楽。じゃあなんでdelegateがあるのかというと、実行速度が早い!
liveは内部でdelegateを実行しているので、一歩遅い!
実行順
bind→delegate→live
実行速度
delegate→live→bind
(とはいえbindを避けるほどの差はないらしい。)
2017/02/02:@smzk様からご指摘頂きましたので、修正致します。
イベントをセットする要素に応じてイベントの発生順決まるため、一概にはこの実行順とは限らないです。
2.複数のイベント処理
- 同じ処理をする
$('.foo').on('click blur', function(){
//処理
});
スペース区切りで記述していく。
- 別々の処理をする
$(.foo).on({
'mouseenter': function(){
//処理内容
},
'mouseleave' : function(){
//処理内容
});
イベントデリゲートで複数イベントを設定する。
$(.parent).on({
'mouseenter': function(){
//処理内容
},
'mouseleave' : function(){
//処理内容
}, '.foo');
結論
特にこだわりが無ければ、.onを使えば良いんじゃないですかね。
追記:live() と die() は jQuery 1.9 で廃止されたようです。
jQueryリファレンス
jQuery 1.9以降で「has no method 'live'」と出たら、 $(document).onを使う
参考URL
jQuery便利なonを使おう
bindとlive, delegateの違い。そしてon。
jQuery の on() と off() を理解する