On occasion I clone DOM elements to repeat form sections dynamically. During this I need to increment the name and id attributes so I can reference them later on.
For example: name=”txtField1″ becomes “txtField2”
To make this happen I use a little but of slick jQuery magic. This increments the id and name attributes and empties the value for input, select, and textarea elements.
var newNum = new Number(num + 1);
var newElem = $('.clonedInput:last').clone(false).attr('id', 'input' + newNum);
newElem.find('input,select,textarea')
.attr('name', function() {
return $(this).attr('name').replace(/^(.+?)(\d+)$/, function(s, p1) {
return p1 + newNum;
});
})
.attr('id', function() {
return $(this).attr('id').replace(/^(.+?)(\d+)$/, function(s, p1) {
return p1 + newNum;
});
})
.val('');
I started out using the regex:
^(.+)(\d+)$
But that failed after 10. The .+ expression needs to be non-greedy using:
^(.+?)(\d+)$
Here’s another example using a table and an button to create a new row:
$("#productChildren").delegate("#btnAddAdditionalProductChildren", "click", function(event) {
var $clone = $("#productChildren > tr").last().clone(false);
$(this).remove();
var $inputs = $( $clone ).find("input[type='text']");
$($inputs).each(function() {
var newNameAttr = $(this).attr('name').replace(/\d+$/, function(match, p1) {
return parseInt(match) + 1;
});
$(this).attr('name', newNameAttr);
$(this).val('');
});
$($clone).appendTo("#productChildren");
});