Bueno, después de un buen rato de ensayo-error, parece que el script ya me funciona tal como quiero, así que le puedo decir que duplique un solo input o varios independientemente de sus nombre o atributos.
Os dejo el código haber que os parece, y si se puede optimizar algo o aportar un punto de vista diferente me lo decis...
La estructura html del input del formulario es:
Código HTML:
Ver original<div class="clonar t-2" data-indice="1" data-nombre="contenedor-telefono"> <p class="normal" data-nombre="cont-telefono"> <input name="cont-telefono1" id="cont-telefono1" class="number ignore" maxlength="9" /> <p class="normal2" data-nombre="cont-extension"> <input name="cont-extension1" id="cont-extension1" class="number cont-extension ignore" maxlength="4" /> <span class="anadir-campo" /> <span class="borrar" data-indice="1" data-nombre="cont-telefono1"/>
*En este caso puedo introducir el teléfono y una extensión, el span borrar no esta visible para el primer elemento (el original), así no lo pueden eliminar. El tema del class del input ignore es para la validación del formulario...
Y la función jQuery que permite hacer lo que he dicho es:
Código Javascript
:
Ver original//Llamada desde formulario
$("span.anadir-campo").live('click', function(){
$(this).insertarCampo();
});
(function($) {
$.fn.insertarCampo = function(){
elem = $(this)
//Buscamos el div que contiene los elementos del formulario
var divClonar = elem.parent().parent();
//Lo clonamos y los insertamos haciendo un fade
divClonar.after(divClonar.clone().hide().fadeIn('slow'));
//Borramos el elemento que contiene el icono de añadir campos
divClonar.find('span.anadir-campo').remove();
//Seleccionamos el indice enviado como atributo en el div que contiene los elementos y lo incrementamos
var indice = divClonar.attr('data-indice');
var tipoContenedor = divClonar.attr('data-nombre');
indice++;
//Seleccionamos el nuevo elemento
var nuevoElemento = $('div.clonar[data-nombre=' + tipoContenedor + ']:last');
//incrementamos el atributo indice del nuevo elemento
nuevoElemento.attr('data-indice', indice);
//Mediante el bucle each, recorremos todos los elementos hijos del elemento creado y corregimos sus
//atributos para no crear conflictos con los elementos ya existentes
nuevoElemento.children().children().each(function(){
var children = $(this);
//Seleccionamos el nombre del elemento duplicado, como dentro del div puede haber más de un <p> que
//contenga inputs, buscaremos este nombre en el contenedor de estos elementos, en este caso en la
//etiqueta <p>
var nombreElemento = children.parent().attr('data-nombre');
//Comprovamos que atributos tiene el elemento, si tiene el atributo especifico, variamos su nombre.
if(children.attr('data-indice')){
children.attr('data-indice', indice);
}
if(children.attr('for')){
children.attr('for', nombreElemento + indice);
}
if(children.attr('name')){
children.attr('name', nombreElemento + indice);
}
if(children.attr('id')){
children.attr('id', nombreElemento + indice);
}
});
//Hacemos visible el elemento que contiene el icono de borrar
nuevoElemento.find('span.borrar').css('visibility', 'visible');
}
})(jQuery);
Bueno después del tocho este, espero vuestros conejos!!
Gracias