El siguiente script de jQuery incorpora dos botones a un formulario HTML que permiten añadir y eliminar campos a voluntad. Lo encontré en el recomendable blog de Charlie Griefer. En la página de Charlie se puede probar una demo.
$(document).ready(function() { $('#btnDel').attr('disabled','disabled'); $('#btnAdd').click(function() { var num = $('.clonedInput').length; // how many "duplicatable" input fields we currently have var newNum = new Number(num + 1); // the numeric ID of the new input field being added // create the new element via clone(), and manipulate it's ID using newNum value var newElem = $('#input' + num).clone().attr('id', 'Add' + newNum); // manipulate the name/id values of the input inside the new element newElem.children(':last').attr('id', 'name' + newNum).attr('name', 'name' + newNum); // insert the new element after the last "duplicatable" input field $('#input' + num).after(newElem); // enable the "remove" button $('#btnDel').attr('disabled',false); // business rule: you can only add 10 names if (newNum == 10) $('#btnAdd').attr('disabled','disabled'); }); $('#btnDel').click(function() { var num = $('.clonedInput').length; // how many "duplicatable" input fields we currently have $('#input' + num).remove(); // remove the last element // enable the "add" button $('#btnAdd').attr('disabled',false); // if only one element remains, disable the "remove" button if (num-1 == 1) $('#btnDel').attr('disabled','disabled'); }); });
Y ahora el DOM:
<form id="testform"> <fieldset id="input1" class="clonedInput"> <label>Name</label> <input type="text" name="name1" id="name1" /> </fieldset> <fieldset> <label>Need more fields?</label> <input type="button" id="btnAdd" value="+" /> <input type="button" id="btnDel" value="-" /> </fieldset> </form>
41 comentarios
Muchas gracias por compartirlo, lo leí aquí hace tiempo y justo hoy andaba buscando una solución más o menos semejante.
Un saludo!
De nada, Ángel. Gracias a ti por leernos.
Muchas gracias por compartirlo, quisiera saber como capturar los valores de este formulario dinamicamente en un php
Hola César, para capturar los valores del formulario con PHP puedes consultar este otro tutorial: Cómo pasar variables de una página a otra en una web con PHP.
Hola buen día, el artículo es muy interesante, me gustaría saber ahora como puedo guardar los datos que se van añadiendo en el formulario por ejemplo en un campo de una tabla en la base de datos.
Hola,
lo que preguntas está fuera de la temática de este tutorial. Además depende mucho del lenguaje y el tipo de base de datos que estés usando.
Hola, una pregunta que nombre de variables tienen los inputs dinamicos? apenas estoy empezando con js y no se que nombre de variable le pone a los input para extraer su contenido en una pagina pho
Hola Luis,
en la línea 11 del código puedes ver cómo se generan los nuevos elementos y cómo se nombran: cada nuevo elemento se nombra como name1, name2, name3…
Hola muchas gracias por el script! Estoy un poco verde con jquery, y tras copiar tu código en una página php, no funciona, aparece todo como debe pero los botones no llegan a hacer nada…. Supongo que me equivoco al añadir la parte de las funciones…. La estoy poniendo dentro de una etiqueta …. pero no se si es así, o tal vez sólo tengo que añadir algun link de jq????
Hola Patricia, comprueba que los atributos id y name de los elementos del formulario (btnAdd, btnDel, clonedInput) coinciden con los definidos en el script. Es el error más común.
Y asegúrate de cargar la librería jQuery antes de cargar el script, claro ;)
Buen día, quisiera saber si estos nuevos input se podrán enviar mediante el método post a otra página PHP con el fin de usar sus contenidos allá para poder luego hacer con ellos lo que uno necesite, gracias!
Hola Gabriel, sí, al quedar dentro de la estructura del formulario se envían con el resto de campos.
Una vez añadidos los nuevos imput como puedo sacar su valor con jquery. Al ser añadidos dinamicamente el dom no me los reconoce por lo que no podria hacer $(‘#name4’)val();
Buena pregunta Rodrigo. Si no funciona efectivamente porque no te los reconoce (no lo he probado) puedes recargar la parte de la página que necesites con AJAX.
el ejemplo esta de la verga pero el Blog de Charlie, su ejemplo esta muy bien, entonces en esta seccion para que puta madre ponen ejemplo de la verga que no sirve!
copie y pegue tal cual el ejemplo pero solo me agrega un campo y no deja eliminarlo, que puede estar pasando ? gracias por tu respuesta de antemano
Hola Jesus, comprueba que los atributos id y name de los elementos del formulario (btnAdd, btnDel, clonedInput) coinciden con los definidos en el script. Es el error más común.
Perdonad, pero a mi no me funciona:
Copio y pego el código en un archivo php, y el botón de «borrar nombre» no está activado.
Hola Pedro,
los errores más comunes a la hora de implementar este código se producen por falta de correspondencia en los nombres de las clases que se usan para lanzar los eventos del script jQuery.
Para detectar posibles errores puedes usar la consola del navegador, Firefox o Chrome por ejemplo, pulsando «control mayúscula i» o con el menú del botón derecho del ratón, seleccionando «inspeccionar elemento».
Muchas gracias por la ayuda, ya he podido solucionarlo y me funciona perfecto!!.
Se puede hacer esto mismo para modificar los datos de una bases de datos?
De nada Pedro :)
No, este código no te permite modificar una base de datos.
Por favor, poned bien el código. No es igual que el ejemplo que muestra luego.
No intenteis probar esto, ya que no funciona.
Ni el ejemplo haciendo Copypaste funciona.
Muchas gracias por la ayuda, en verdad me sirvió de mucho. Solo que ahora tengo un problema. ¿Cómo le haría para que al clonar no tome los datos del textbox anterior?
Hola Felipe, comprueba que los atributos id y name del elemento del formulario clonedInput coinciden con los definidos en el script. Es el error más común.
En mi caso use radiobuttons, y puesto que todos los bloques de radios name deben ser diferente, se me ocurrio agregarle un random, ahora el problema es que no se como capturar el nombre de esa variable con post.
tengo algo asi:
Habra alguna manera de capturarlo con post?
Hola Francisco,
se me ocurre una manera sencilla, que te evitará enfrentarte a los identificadores aleatorios: puede crear una matriz con todos los valores, de manera que luego puedes leer esa matriz. Esto lo puedes hacer definiendo el atributo name de cada elemento de la siguiente manera:
name="matriz[]"
.Puedes acceder a la matriz en
$_POST['matriz'].
tengo dos select , el segunto depende del primero, y necesito duplicarlos a los dos y con su dependencia totalmente para cada uno ..
Hola, necesito esta funcionalidad para un formulario que tengo en Ionic, pero no consigo que me funcione tu código
Hola Juanjo,
para poder ayudarte necesitaría algún detalle más sobre lo que estás intentado hacer.
El ejemplo me funciona bien, el problema es que al enviar el formulario, este me recoge solamente el primer campo :/
Hola Felipe,
revisa los valores que has usado para los atributos name e id con un inspector de código en el navegador: el 99% de las veces los problemas vienen de errores en la nomenclatura.
Hola como va, tengo un problema con el código. Me deja agregar solamente un campo y no me deja eliminarlo despues. Los id y todo eso esta perfecto, me podías decir con que librería de jquery esta echo? gracias
Hola Juan, no utiliza ninguna librería de jQuery, únicamente jQuery.
Hola, el script demo me corre muy bien, sólo que necesito clonar 4 cajas de texto y la primera me la pone muy bien nombre1, nombre2, nombre3… etc. pero las demás se quedan como apellido1, apellido1, apellido1… etc. qué puedo hacer en este caso?
De antemano, muchas gracias.
Hola Amarok,
tienes que añadir una línea para generar los atributos id y name de los nuevos elementos «apellido», similar a la que tienes para los nombres. Algo así (aunque puede cambiar en función de los identificadores que estés usando):
Hola estimado, espero me puedas ayudar tengo la siguiente duda:
Tengo un listado de pacientes y 3 formularios que se deben llenar por cada uno, entonces lo que deseo es que cuando se aperture un paciente se generen los formularios en 3 opciones y cuando de clic en una opcion me muestre el formulario por ejemplo 1 con los datos basicos del paciente.
Opciones
Nombres y Apellidos
Fecha de registro
PA Inicial
PA Final
Peso Inicial
Peso Final
N° de Maquina
DNI
Opciones
Nombres y Apellidos
Fecha de registro
PA Inicial
PA Final
Peso Inicial
Peso Final
N° de Maquina
DNI
En la parte que dice opciones estoy cargando 3 icons de fichas para cada ficha medica
«0»=>’idparteenfermeria.’)»>‘
lo que quiero es que cunado abra me muestre el formulario que cree y salgan los datos del paciente y bueno rellnearlo y se registre
Hola Eduardo,
si entiendo bien lo que preguntas, tu duda no está relacionado con clonar campos de un formulario de manera dinámica, que es el tema de este artículo. Este artículo es bastante concreto, para hacer lo que necesitas quizás te venga bien consultar un tutorial de cómo usar formularios o recurrir a algún servicio que te permita poner en funcionamiento un formulario sin necesidad de pogramarlo tú mismo.
El charly se murio porque su pagina ya no existe ;)
Cierto Ernesto! Gran problema la desaparición de páginas web… Siempre nos quedará archive.org.
Muchas gracias que si me ah funcionado