bindとonは一緒
$( "body" ).on( "click", function() {
alert( "Goodbye!" );
});
本来のJavaScriptイベントハンドラは、onclick
、onblur
のように頭にonをつけます。
しかし、jQueryではonを付けずに使用していますよね。
このon
を使うことにより、本来のJavaScriptのようにonclick
と指定しているように見えるというのは、個人的には利点だな、と思っています。
もちろん、そんな理由でbind
からon
に名称が変更されたというわけではありません。bind
の問題点を改善して改善してできた機能を統合してできたのが、on
です。オールマイティな優れものです。
とはいえ、機能が増えたことで、「引数が増えたー」「ややこしいー」と思うかもしれませんが、考え方によっては、そうでもありません。特にlive
、delegate
を知らない、使ったことがないという場合、bind
とon
の違いはないといってもあながち間違いではありません。(メモリ効率や処理速度について言及したものではないということを付け足しておきます。)
むしろon
であれば、bind
と同じ書き方でlive
とdelegate
の機能が使えると考えるほうが間違いといえます。
使用方法は簡単です。これまでbind
を使っていたところをon
に変えてみてください。文法を全く変えずにbind
と同じ動作をさせることができます。
そして今後はon
を使用しましょう。それは機能が豊富だからという理由ではありません。単にversion 1.7以降on
の使用が推奨されているからです。
liveとdelegate
on
を説明するうえで、必要なキーワードはbind
だけではありません。他に、live
、delegate
、[click, change, focus...]
が重要なキーワードとなります。これらの機能を合わせ持つのがon
です。
ただし、live
、delegate
はそれぞれ非推奨や削除された機能です。
- liveは、jQuery version 1.7からdeprecated(廃止予定)、version 1.9でremoved(削除)
- delegateは、jQuery version 1.7から非推奨
最新版からjQueryを使用するなら特に覚える必要はないと思いますが、on
の全容を理解するには役に立つと思います。
ここでは機能について説明は行いませんが、簡単にいうと、
-
live
は動的に作成された要素にも対応可能なbind
-
delegate
はlive
の様々な問題に対応したlive
live、delegateをonに変える際に注意すること
変更の際は以下のことに注意してください。
-
live
はbind
と同じ書き方 -
live
をそのままon
に変えてもlive
の機能は使えません -
delegate
はon
と引数の順序が異なる -
delegate
をそのままon
に変えても動きません
// live
$( "a.offsite" ).live( "click", function() {
alert( "Goodbye!" );
});
// delegate
$( document ).delegate( "a.offsite", "click", function() {
alert( "Goodbye!" );
});
上記のようなlive
もしくはdelegate
をon
にする場合、以下のようにします。(参考)
// on
$( document ).on( "click", "a.offsite", function() {
alert( "Goodbye!" );
});
delegate
の第1引数と第2引数が入れ替わった感じです。これで、on
を使用した場合でもlive
もしくはdelegate
の機能を使うことができます。
events系メソッド(click, change, blurなど)
bind
もしくはon
は、以下のような書き方ができます。
$( "body" ).click( function() {
alert( "Goodbye!" );
});
引数が少なくスッキリとした書き方です。
この書き方は、bind
もしくはon
と同じ動きをします。
$( "body" ).bind( "click", function() {
alert( "Goodbye!" );
});
$( "body" ).on( "click", function() {
alert( "Goodbye!" );
});
それでは何が違うのでしょうか。
それは実際のjQueryの定義を見るのが早いでしょう。
古いjQueryのソースから確認します。
// jQuery version 1.3.2
click: function (G){return G?this.bind(E,G):this.trigger(E)}
ただbind
を呼んでいるだけでした。さて、最新版ではどうでしょうか。
// jQuery version 2.1.1
click: function (a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}
なんと、ちゃんとon
に変わっているではないですか。
1回余計な関数を挟むだけ、という考えもあると思いますが、ある意味これは使えます。
引数が少なくて済むし、なにより古いバージョンからこの書き方をしていたとしても、わざわざon
に書き換える必要がないんです。便利ですね。