Я предполагаю, что что-то подобное может сработать, если я правильно понял вопрос.
Во-первых, очистите все обработчики кликов из каждой строки. Замените последние строки элементов их значениями. И, наконец, добавьте обработчики кликов в каждую строку, чтобы снова вернуть значения в элементы.
$('#btnAdd').click(function() {
$('#mainTable tr').unbind('click');
var lastRow = $('#mainTable tr:last');
// its simpler to clone now, and just replace entire row later when needed
var clonedRow = lastRow.clone();
replaceWithValues(lastRow);
$('#mainTable tr').click(function() {
$(this).replaceWith(clonedRow);
);
}
Поскольку я предполагаю, что все элементы HTML (text, checkbox, textarea, select) имеют функцию val()
, вы можете игнорировать тип элемента, с которым имеете дело при замене. Вам нужен какой-то способ сообщить, какое значение принадлежит какому типу элемента, хотя, когда вы будете возвращать их обратно элементам.
function replaceWithValues(row) {
var elements = $('td > *', row);
elements.each(function() {
var value = $(this).val();
$(this).replaceWith(value);
});
}
Редактировать : вам не нужно индивидуально возвращать каждый элемент обратно, просто клонируйте всю строку и замените ее.
Заменить обратно на элементы тоже должно быть довольно просто. Вы можете добавить классы в каждую ячейку строки, чтобы указать, какой тип элемента идет туда.
<tr>
...
<td class="textField">
<input type="text" />
</td>
...
Затем в функции replaceWithElement
можно выбрать ячейки по типу и заменить существующим значением:
function replaceWithElements(row) {
$('.textField', row).each(function() {
var element = $("<input type='text' />").attr('value', $(this).text());
$(this).empty().replaceWith(element);
});
$('.selectField') ...
$('.textAreaField') ...
}