Обновление
Только что увидел отредактированный HTML, поэтому вот добавленная функция для обработки нескольких входов с разными именами:
lastTr.find('input').each(function() {
let nameText = $(this).attr('name');
let newName = nameText.split('index').join(rows);
$(this).attr('name', newName);
});
Для того, чтобы изменить шаблон каждого имени без необходимости чтобы запомнить, какое из них должно обрабатывать только ту часть имен, которая действительно изменяется:
let newName = nameText.split('index').join(rows);
nameText
- это текущее имя ввода, которое имеет строковое значение:
'data[index][description]',
'data[index][text]',
/* OR */
'data[index][date]'
Когда .split()
в массив строк, он удаляет текст: "index"
:
nameText.split('index')
// Returns ['data[', '][`description or text or date`]']
Наконец .join()
преобразует массив строк в строку с номером переменной переменной между их:
.join(index)
// Returns `'data['+index+'][`description or text or date`]'`
Добавьте следующий оператор в качестве первой строки функции:
let rows = $('.taskTable tr').length;
Это будет количество строк уже в таблица.
Добавьте это после того, как строка была клонирована, но до ее добавления:
lastTr.find('input').attr('name', 'data' + rows);
Это находит вход, вложенный в новую строку, и назначает его name="data'+rows
. Я не уверен, что с [description]
частью названия. Это динамическое c или буквальное, как часть [index]
. Похоже, что-то не так с этими именами ...
Примечание: Остальное имя может быть любым, я просто чувствую, что неправильно имя, похожее на это. Строка с контактом будет выглядеть следующим образом с исходным текстом:
lastTr.find('input').attr('name', 'data[' + rows + '][description]');
Кроме того, я добавил еще одну функцию, которая изменит ввод всех строк с новым шаблоном имен.
Демо
/*
This will change all row input names from
'data[index][description]'
'data[index][text]'
'data[index][date]'
to
'data['+index+'][description]'
'data['+index+'][text]'
'data['+index+'][date]'
index = 0,...N
*/
$('.addTask tr').each(function(index) {
$(this).find('input').each(function() {
let nameText = $(this).attr('name');
let newName = nameText.split('index').join(index);
$(this).attr('name', newName);
});
});
$(".addTask").on('click', function(index) {
let rows = $('.taskTable tr').length;
const lastTr = $('.taskTable').find('tr:last').clone();
lastTr.find('input').each(function() {
let nameText = $(this).attr('name');
let newName = nameText.split('index').join(rows);
$(this).attr('name', newName);
});
$('.taskTable').append(lastTr);
});
<table class='taskTable'>
<tr><td>
<input name='data[index][description]'>
<input name='data[index][text]'>
<input name='data[index][date]'>
</td></tr>
<tr><td>
<input name='data[index][description]'>
<input name='data[index][text]'>
<input name='data[index][date]'>
</td></tr>
</table>
<button class='addTask' type='button'>Add Row</button>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>