HTML
次のようなHTMLがあるとします。
追加ボタンをクリックするとリストが一つ増え、削除ボタンをクリックするとリストから項目が削除されます。
name属性にインデックスが割り当てられているのがわかります。
このインデックスを例えば2つ目の項目が削除された場合でも0,1となるようにします。
<div class="items"> <button class="add-btn">追加</button> <ul class="item-list"> <li class="item"> <input type="text" name="item[0][title]" class="input"> <textarea type="text" name="item[0][content]" class="input"></textarea> <button class="remove-btn">削除</button> </li> <li class="item"> <input type="text" name="item[1][title]" class="input"> <textarea type="text" name="item[1][content]" class="input"></textarea> <button class="remove-btn">削除</button> </li> <li class="item"> <input type="text" name="item[2][title]" class="input"> <textarea type="text" name="item[2][content]" class="input"></textarea> <button class="remove-btn">削除</button> </li> </ul> </div>
jQuery
jQueryをみてみましょう。
[]の中の数字を置換しているという感じです。
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script type="text/javascript">
(function($) {
$(function () {
function numbering($list) {
$list.find('.item').each(function(index) {
$(this).find('.input').each(function() {
var replaceText = $(this).attr('name').replace(/\[\d+\]/, '['+index+']');
$(this).attr('name', replaceText)
})
})
}
var $items = $('.items');
$items.on('click', '.add-btn' ,function() {
var $list = $(this).next('.item-list');
var $cloneItem = $list.find('.item:last').clone();
$list.append($cloneItem);
numbering($list);
});
$items.on('click', '.remove-btn' ,function() {
var $list = $(this).closest('.item-list');
$(this).closest('.item').remove();
numbering($list);
});
});
})(jQuery);
</script>
この手のUIいじる形でしたら、素直にReactとかVueを使った方が簡単です。

