動的に生成したDOM要素にイベントを設定する方法をメモ。
サンプルコード
.list__itemをクリックするとconsoleにindexを返す処理と、#addをクリックで.list__itemを追加する処理を実装します。
HTML
<ul class="list"> <li class="list__item">リスト</li> <li class="list__item">リスト</li> <li class="list__item">リスト</li> <li class="list__item">リスト</li> <li class="list__item">リスト</li> </ul> <button id="add">リストの追加</button>
JavaScript
$(function() { $('.list__item').on('click', function() { console.log($(this).index()); }); $('#add').on('click', function() { var insert = ''; for (var i = 0; i < 5; i++) { insert += '<li class="list__item">リスト</li>'; } $('.list').append(insert); }); });
この場合、追加した.list__itemをクリックしてもconsoleは表示されません。
対応前のデモページ
.list__itemを追加した後に、.list__itemに再度 $(‘.list__item’).on(‘click’, fn); でイベントを追加してみます。
JavaScript
$(function() { $('.list__item').on('click', function() { console.log($(this).index()); }); $('#add').on('click', function() { var insert = ''; for (var i = 0; i < 5; i++) { insert += '<li class="list__item">リスト</li>'; } $('.list').append(insert); $('.list__item').on('click', function() { console.log($(this).index()); }); }); });
追加した.list__itemでconsoleが出るようになりましたが、それ以外でconsoleが余分に出るようになりました。
うまくいかない場合のデモページ
$(document).on(‘click’, ‘.list__item’, fn); でイベントを追加するようにしてみます。
JavaScript
$(function() { $(document).on('click', '.list__item', function() { console.log($(this).index()); }); $('#add').on('click', function() { var insert = ''; for (var i = 0; i < 5; i++) { insert += '<li class="list__item">リスト</li>'; } $('.list').append(insert); }); });
追加した.list__itemだけに新しくイベントが追加されました。
対応後のデモページ
off()を使っていったんイベントを解除して、再度イベント追加する方法でも対応できます。
JavaScript
$(function() { $('.list__item').on('click.test', function() { console.log($(this).index()); }); $('#add').on('click', function() { $('.list__item').off('click.test'); var insert = ''; for (var i = 0; i < 5; i++) { insert += '<li class="list__item">リスト</li>'; } $('.list').append(insert); $('.list__item').on('click.test', function() { console.log($(this).index()); }); }); });
コメントが承認されるまで時間がかかります。