jQuery1.8ぐらいから、
.click(function(){}) →.on('click', 'id', function() {})
↑で書くべし的な事を言われてちゃんと.onで書いているのになぜか?効かない。。。
1時間ぐらいハマったのでメモ。。
1. まずはjQueryのバージョンを確認
.on()メソッドはjQuery1.7に登場ですので、
当然それより前のバージョンでは使用できません。。
意外と見落としてしまいます。
レスボンシブ対応の比較的新しいサイトでv1.5.2が使われていた。。なんて事もありました。
わりとよく使うjs系をテンプレセットにして何年も使う会社もありますし、古いサイトのメンテやセミリニューアルなどで物凄く古いjQuery Libraryに出会う事もあります。
*ファイル名が「jquery.js」とバージョン名が書かれていない物は、中身(ソース)を見て上の方に↓など記載が無いか確認。
/*! * jQuery JavaScript Library v1.5.2 * http://jquery.com/ */
*対応方法
$('#id').on('click','li>a', function() { //クリックした後の処理 });
$('#id li>a').click(function(){ //クリックした後の処理 });
2. 動的に生成された要素にイベントをかける場合
jQuery1.9の現象なのか?後から.appendや.html()などで追加した要素に効かない場合があります。
動的に変化する要素へのイベントは、変化しない親の要素に仕込むと動きます。
*対応方法
$('#id').on('click',function() { //クリックした後の処理 });
$(document).on('click','#id', function() { //クリックした後の処理 });
【注意点】
この場合、内部的には#idに対してイベントを割り振っているのでなく、documentでclickイベントを拾う→event.targetのIDがidだった場合に発動します。
なので、clickイベントは問題なく動きますが、scrollイベントなどの場合は動かないかもしれません。
この場合、内部的には#idに対してイベントを割り振っているのでなく、documentでclickイベントを拾う→event.targetのIDがidだった場合に発動します。
なので、clickイベントは問題なく動きますが、scrollイベントなどの場合は動かないかもしれません。
ちなみに1と2両方対象で、
.on → .liveに変えるでもOK
$('#id li>a').live('click',function(){ //クリックした後の処理 });
.live → 後から追加した要素にもイベントを実行させる
(セレクタを「document」などにしなくても良い)
※liveはjQuery1.9で廃止