Adicionar Campos Dinâmicos
Um componente muito util para formulários é você poder adicionar campos dinâmicamente em seu formulário, por exemplo… Em um formulário de cadastro de uma pessoa, você precisa que ele preencha o formulário com todos os telefones dela.
Mas você não sabe quantos telefones essa pessoa tem. Então precisamos que ela possa adicionar campos nesse formulário, vou mostrar uma forma bem fácil de você resolver esse problema usando novamente a biblioteca JQuery.
No nosso index.html faremos nosso formulário…
Lembrando que você precisa ter o arquivo da biblioteca jquery na mesma pasta do seu index.
O nosso aplicacao.js ficaria assim:
Vamos explicar o que foi feito:
Linha 1 - Define o código JQuery que será rodado no carregamento da página.
Linha 2 - Declara uma função chamada removeCampo.
Linha 3 - Tira qualquer função que esteja setada para ser executada quando o elemento com a classe removerCampo seja clicado.
Linha 4 - Quando um elemento com a classe removerCampo for clicado executará a seguinte função.
Linha 5 - Teclara uma variavel i igual a zero.
Linha 6 - Para cada p com a classe campo telefone dentro de um elemento com a class telefones executará a seguinte função.
Linha 7 - Incrementa a variavel i (a linha 5 e 6 servem para contar quantos p.campoTelefone existem dentro do elemento com a classe telefones).
Linha 9 - Se i for maior que 1 (se esse não for o unico elemento dentro da div telefones.
Linha 10 - Remove o pai do link clicado, ou seja, o p.campoTelefone.
Linha 14 - Executa a função removeCampo().
Linha 15 - Quando um elemento com a classe adicionarCampo for clicado.
Linha 16 - Clona o primeiro p com a classe campoTelefone e insere em uma variável que chamei de novoCampo.
Linha 17 - Procura dentro do elemento novoCampo um input e seta o value dele como vazio.
Linha 18 - Insere o elemento novoCampo depois do ultimo p com a classe campoTelefone.
Linha 19 - Executa a função removeCampo.
E está feito nosso componente de adicionar campos de telefone dinamicamente. Se você não entendeu porque eu tieve que executar a função removeCampo duas vezes, leia o artigo AJAX - Primeiros Problemas onde tem uma explicação melhor sobre esse assunto.
Quando esse formulário for submetido você receberá em seu PHP um array de telefones.
Gostaram?
Você pode ver esse exemplo funcionando clicando aqui.
Mas você não sabe quantos telefones essa pessoa tem. Então precisamos que ela possa adicionar campos nesse formulário, vou mostrar uma forma bem fácil de você resolver esse problema usando novamente a biblioteca JQuery.
No nosso index.html faremos nosso formulário…
| HTML | | copy code | | ? |
| 01 | < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" |
| 02 | "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
| 03 | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> |
| 04 | <head> |
| 05 | <meta http-equiv="content-type" content="text/html; charset=utf-8" /> |
| 06 | <title>Exemplo</title> |
| 07 | <script type="text/javascript" src="jquery.js"></script> |
| 08 | <script type="text/javascript" src="aplicacao.js"></script> |
| 09 | </head> |
| 10 | |
| 11 | <body> |
| 12 | <div style="border:1px solid #CCC; background-color:#EFEFEF; padding:0 20px;"> |
| 13 | <h1>Exemplo Campos Dinâmicos</h1> |
| 14 | <p>Esse arquivo é parte de um arquivo feito por Maurício Faustino para mostrar como um formulário com campos dinâmicos</p> |
| 15 | |
| 16 | </div> |
| 17 | <div style="width:500px; margin:auto;"> |
| 18 | |
| 19 | <form action="mantemPessoas.php" method="post"> |
| 20 | <fieldset> |
| 21 | <legend>Dados Pessoais</legend> |
| 22 | <p> |
| 23 | <label for="nome">Nome da Pessoa</label> |
| 24 | <input id="nome" type="text" name="nome" /> |
| 25 | </p> |
| 26 | <p> |
| 27 | <label for="dataNascimento">Data de Nascimento</label> |
| 28 | <input id="dataNascimento" type="text" name="dataNascimento" /> |
| 29 | </p> |
| 30 | </fieldset> |
| 31 | <fieldset> |
| 32 | <legend>Telefones</legend> |
| 33 | <div class="telefones"> |
| 34 | <p class="campoTelefone"> |
| 35 | <input type="text" name="telefone[]" /> |
| 36 | <a href="#" class="removerCampo">Remover Campo</a> |
| 37 | </p> |
| 38 | </div> |
| 39 | <p> |
| 40 | <a href="#" class="adicionarCampo">Adicionar Telefone</a> |
| 41 | </p> |
| 42 | </fieldset> |
| 43 | |
| 44 | </form> |
| 45 | <a href="http://www.mauriciofaustino.com/2009/04/adicionar-campos-dinamicos/">Voltar para o post.</a> |
| 46 | </div> |
| 47 | </body> |
| 48 | </html> |
O nosso aplicacao.js ficaria assim:
| Javascript | | copy code | | ? |
| 01 | $(function () { |
| 02 | function removeCampo() { |
| 03 | $(".removerCampo").unbind("click"); |
| 04 | $(".removerCampo").bind("click", function () { |
| 05 | i=0; |
| 06 | $(".telefones p.campoTelefone").each(function () { |
| 07 | i++; |
| 08 | }); |
| 09 | if (i>1) { |
| 10 | $(this).parent().remove(); |
| 11 | } |
| 12 | }); |
| 13 | } |
| 14 | removeCampo(); |
| 15 | $(".adicionarCampo").click(function () { |
| 16 | novoCampo = $(".telefones p.campoTelefone:first").clone(); |
| 17 | novoCampo.find("input").val(""); |
| 18 | novoCampo.insertAfter(".telefones p.campoTelefone:last"); |
| 19 | removeCampo(); |
| 20 | }); |
| 21 | }); |
Linha 1 - Define o código JQuery que será rodado no carregamento da página.
Linha 2 - Declara uma função chamada removeCampo.
Linha 3 - Tira qualquer função que esteja setada para ser executada quando o elemento com a classe removerCampo seja clicado.
Linha 4 - Quando um elemento com a classe removerCampo for clicado executará a seguinte função.
Linha 5 - Teclara uma variavel i igual a zero.
Linha 6 - Para cada p com a classe campo telefone dentro de um elemento com a class telefones executará a seguinte função.
Linha 7 - Incrementa a variavel i (a linha 5 e 6 servem para contar quantos p.campoTelefone existem dentro do elemento com a classe telefones).
Linha 9 - Se i for maior que 1 (se esse não for o unico elemento dentro da div telefones.
Linha 10 - Remove o pai do link clicado, ou seja, o p.campoTelefone.
Linha 14 - Executa a função removeCampo().
Linha 15 - Quando um elemento com a classe adicionarCampo for clicado.
Linha 16 - Clona o primeiro p com a classe campoTelefone e insere em uma variável que chamei de novoCampo.
Linha 17 - Procura dentro do elemento novoCampo um input e seta o value dele como vazio.
Linha 18 - Insere o elemento novoCampo depois do ultimo p com a classe campoTelefone.
Linha 19 - Executa a função removeCampo.
E está feito nosso componente de adicionar campos de telefone dinamicamente. Se você não entendeu porque eu tieve que executar a função removeCampo duas vezes, leia o artigo AJAX - Primeiros Problemas onde tem uma explicação melhor sobre esse assunto.
Quando esse formulário for submetido você receberá em seu PHP um array de telefones.
Gostaram?
Você pode ver esse exemplo funcionando clicando aqui.
Tags: javascript, JQuery






Obrigada pela ajuda
[]‘s
$(“.telefones p.campoTelefone:first”).clone().val(“”).insertAfter(“.telefones p.campoTelefone:last”);
parabéns
ALTERAÇÃO NO HTML
ALTERAÇÃO NO JS
$(”.telefones p.campoTelefone:first”).clone().insertAfter(”.telefones p.campoTelefone:last”);
$(“.campo:last”).val(“”);
Resolvi o bug que você reportou de outra forma.
Caso se interesse veja como ficou o aplicacao.js
usei a função find()
[]‘s
espero resposta desde já agradeço
___________________________________________
No meu caso era pra uploads multiplos de fotos de veículos, mas é simples de entender. Na função de adicionar campo:
tam=0;
$(“.fotosVeiculo p.campoFotoVeiculo”).each(function () {
tam++;
});
if (tam < 6) {
novoCampo = $(".fotosVeiculo p.campoFotoVeiculo:first").clone();
novoCampo.insertAfter(".fotosVeiculo p.campoFotoVeiculo:last");
novoCampo.find("input").val("");
removeCampo();
} else {
alert("O limite de fotos foi atingido.");
}
EXEMPLO:
i=0;
$(“.telefones p.campoTelefone”).each(function () {
i++;
});
if (i<5) {
// aqui a função de adição de campos
}
Como resolver??
Abs,
da linha 9 do js
Obrigado.
Fiz as seguintes alterações no aplicacao.js:
$(function () {
function removeCampo() {
$(“.removerCampo”).unbind(“click”);
$(“.removerCampo”).bind(“click”, function () {
i=0;
$(“.pobre”).each(function () {
i++;
});
if (i>1) {
$(this).parent().remove();
}
});
}
removeCampo();
$(“.adicionarCampo”).click(function () {
novoCampo = $(“.pobre:first”).clone().val(“”);
novoCampo.find(“input”).val(“”);
novoCampo.insertAfter(“.pobre:last”);
removeCampo();
});
});
Funcionou legal para repetição da parte do form que preciso, mas só nos campos “input” ele está zerando, nos campos “select” vem com a opção já selecionada do anterior.
Deu para entender?
Para constar, sou novato..
Falta de atenção minha..
Resolvido, obrigado pela atenção..
Valeu..
Tipo telefone[1], telefone[2], telefone[3]….
Obrigado
vc irá cadastrar um cd e precisa adicionar as faixas, então podem existir cds com 5 faixas assim cds com 10 faixas… dai vc cadastra o cd e vai clicando “add faixa” assim vc cadastra campos como, nome do artista, nome da musica, gravadora, etc….
vc poderia nos dar uma força ?
Fiz um exemplo do que você pediu, você pode acessar através do link:
http://jsfiddle.net/gnsrF/
veja se resolve….
qualquer coisa é só falar
No caso do PHP basta você colocar name[] que ele já recebe com os indices preenchidos, no caso de outras linguagens como o java, isso não acontece.
nesse exemplo resolvi esse problema fazendo um replace nos indices:
http://jsfiddle.net/gnsrF/
veja se isso resolve, caso não resolva, comente aqui sua dúvida!
obrigado.
Para remover segue a mesma ideia:
http://jsfiddle.net/srsnT/
não me preucupei em controlar o numero da faixa (ou seja, pode se ter faixa 1 e faixa 7)
deixei para você fazer essa lógica…
claro que esse código pode ser melhorado (e muito), mas a idéia é mais ou menos por ai.
qualquer coisa é só comentar.
muito obrigado pela sua ajuda! já estou fazendo o codigo aqui!!! um forte abraço!!!
Willian
por exemplo:
novoCampo.find(“input”).name(“teste);
?
Você pode usar novoCampo.find(“input”).attr(“name”,”novoNome”);
você pode usar o insertAfter sem problemas…
Só que preciso mesmo que cada campo tenha uma ID diferente porque eu uso um gerador que pega o valor do campo pela ID (getElementById) e no final envia um texto personalizado com essas ID formatadas. Tem como fazer isso?
Primeiramente queria te agradecer por ter liberado esse código pra galera, ele me ajudou bastante no que queria fazer
Mas tenho uma dúvida, tipo, eu quero adicionar uma linha inteira de inputs, quando a pessoa clica em ‘adicionar campos’, mas quando eu boto tags de tabela dentro da div, a função não funciona…
Sei que isso pode ser uma dúvida fraca de HTML, mas eu sou iniciante nessa área e preciso de ajuda
Se puderes me ajudar com esse probleminha, serei muito grato.
abraços!
Posso ajudar sim!
Por gentileza coloque o seu código HTML e Javascript no http://jsfiddle.net
e cole o endereço aqui, para que eu possa entender melhor o problema….
Valeu!
Eu consegui botar dentro das tags de tabelas, agora o único problema é para remover as TRs geradas, pois o script adiciona os campos mas não remove..
Tens como dar uma olhadinha ?
abraço e boa semana!
$(function () {
function removeCampo() {
$(“.removerCampo”).unbind(“click”);
$(“.removerCampo”).bind(“click”, function () {
i=0;
$(“.campos_form”).each(function () {
i++;
});
if (i>1) {
$(this).parent(‘tr’).remove();
}
});
}
removeCampo();
$(“.adicionarCampo”).click(function () {
novoCampo = $(“.campos_form:first”).clone();
novoCampo.find(“input”).val(“”);
novoCampo.insertAfter(“.campos_form:last”);
removeCampo();
});
});
Não consigo achar onde está o erro :s
Desculpe a demora…
Seu código arrumado…
http://jsfiddle.net/7WdbF/5/
o problema estava no
$(this).parent(‘tr’).remove();
mudei para:
$(this).parent().parent().remove();
Qualquer coisa to aí.
Insira essa esse comando na linha 17 do aplicacao.js
novoCampo.find(“input”).attr(“id”, “id”+i);
Se não for pedir demais, você sabe como posso fazer para “ocultar” o botão de remover naquela primeira linha de campos “default” ?
Agradeço novamente pela sua atenção, grande abraço!
Alterado seu código, para caso tenha apenas 1 linha
ocultar o botão remover…
http://jsfiddle.net/7WdbF/11/
abraço!
Poste seu código no http://pastebin.com/ e me manda o link pra eu dar uma olhada…