11
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

click()とon('click', function())の違い

Last updated at Posted at 2017-02-01

覚えたての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() を理解する

11
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?