このような問題を解決
| 歳 | 削除 | |
| 歳 | 削除 | |
| 追加 | ||
まず、上の表の「削除」をクリックしてみてください。どちらをクリックしても削除できるかと思います。※最後の1つは削除できないようにしています
次に、「追加」をクリックしてください。1つ上の行と同じ行が追加されます。追加された要素の「削除」をクリックしてください。削除できません。追加された要素も削除できるよう対応します。
結論から言います
イベント処理に使用する「on」の指定の仕方の違いです。
$('.delete-row').on('click', function() {
こちらの場合、追加された要素ではイベント(例だとクリック)が発生しません。
$('body').on('click', '.delete-row', function() {
こちらの場合ですと、追加された要素でもイベント(例だとクリック)が発生します。
修正は2か所です。$(‘.delete-row’)を$(‘body’)に変更します。※親要素へ変更しています。親であればだれでもOK
次に、親に変更した$(‘.delete-row’)の要素部分’.delete-row’をイベントの後ろに引数として追加します。見た方が分かりやすいですね。「on(‘click’, function」→「on(‘click’, ‘.delete-row’, function」と追加してください。
以上で、解決します。
修正後
| 歳 | 削除 | |
| 歳 | 削除 | |
| 追加 | ||
追加して削除してみてください。削除できるようになっています。
onについて(イベントの後ろの引数)
親要素に変更する点は特に気にならないかと思います。
イベントの後ろに引数を追加しましたが、こちらの引数にはセレクタを指定することができます。今回だと(‘.delete-row’)です。つまり対象要素としては$(‘body .delete-row’)ということです。
セレクタで指定した場合は、追加要素でも対象になるんですね。
おそらく…
前者の場合は、ページ表示時に対象要素を確定させているのでしょう。よって、要素が追加されたとしても、対象要素に加える処理が存在しないのだと思います。後者の場合はセレクタ部分はページ表示時ではなく、イベント発生時に探し直すのだと思われます。
つまり、処理としては前者の方が早いかもしれないですね。ケースによって使い分けると良いかもしれないです。
参考までにソースを書いておきます
cssは動作には関係ありませんので割愛します。htmlは共通です。
HTML
<table><tbody>
<tr>
<td><input type="number" name="age" value="25" />歳</td>
<td><input type="text" name="name" value="たろう" /></td>
<td><span class="delete-row">削除</span></td>
</tr>
<tr>
<td><input type="number" name="age" value="25" />歳</td>
<td><input type="text" name="name" value="はなこ" /></td>
<td><span class="delete-row">削除</span></td>
</tr>
<tr>
<td colspan="3"><span class="add-row">追加</span></td>
</tr>
</tbody></table>
javascript
javascriptです。「add-row」のイベント処理は全く同じです。
期待通り動かないソース
<script>
jQuery(document).ready(function($){
// 行を追加します
$('.add-row').on('click', function() {
var add = $(this).parents('tr').prev().clone();
$(this).parents('tr').before(add);
});
// 行を削除します(追加要素は削除できない)
$('.delete-row').on('click', function() {
var len = $(this).parents('table').find('tr').length;
if (len < 3) {
alert('最後の1つは削除できません')
return;
}
$(this).parents('tr').remove();
run();
});
});
</script>
期待通り動くソース
<script>
jQuery(document).ready(function($){
// 行を追加します
$('.add-row').on('click', function() {
var add = $(this).parents('tr').prev().clone();
$(this).parents('tr').before(add);
});
// 行を削除します(追加要素は削除できる)
$('body').on('click', '.delete-row', function() {
var len = $(this).parents('table').find('tr').length;
if (len < 3) {
alert('最後の1つは削除できません')
return;
}
$(this).parents('tr').remove();
run();
});
});
</script>
スポンサーリンク

