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.
Estive recebendo muitas dúvidas dos visitantes do blog sobre como pegar os telefones no arquivo PHP que vai receber as informações desse formulário...
Segue um exemplo simples para pegar o resultado:
Explicando...
Linha 2 - Pega as informações que foram passadas via POST pelo formulario. (no caso do PHP, ele ja identifica o [] no atributo name do input e identifica como um array)
Linha 3 - Pega a quantidade de telefones que tem no array.
Linha 4 - Faz um laço para varrer todo o array de telefones.
Linha 5 - Mostra cada telefone.
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.
Estive recebendo muitas dúvidas dos visitantes do blog sobre como pegar os telefones no arquivo PHP que vai receber as informações desse formulário...
Segue um exemplo simples para pegar o resultado:
| PHP | | copy code | | ? |
| 1 | < ?php |
| 2 | $telefone = $_POST['telefone']; |
| 3 | $quantidade = count($telefone); |
| 4 | for ($i=0; $i<$quantidade; $i++) { |
| 5 | echo "Telefone: ".$telefone[$i]."<br />"; |
| 6 | } |
| 7 | ?> |
Explicando...
Linha 2 - Pega as informações que foram passadas via POST pelo formulario. (no caso do PHP, ele ja identifica o [] no atributo name do input e identifica como um array)
Linha 3 - Pega a quantidade de telefones que tem no array.
Linha 4 - Faz um laço para varrer todo o array de telefones.
Linha 5 - Mostra cada telefone.
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



Dá sim, já fiz isso usando o plugin do bassistance.de….
http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/
$(“.adicionarCampo”).click(function () {
$(this).prev().clone().insertBefore(this);
});
coloca o campo que tu quer clonar antes do botão adicionar ok?
abraço, mestre Jq.
Você está usando qual linguagem no lado do servidor?
Quais são o atributos “name” dos campos?
att.
Obrigado
Estou usando seu script sem problemas, porém gostaria de setar o foco para o primeiro campo e depois quando adicionar outro campo setar para este.
Pode ajudar?
Valeu
Para setar o foco no primeiro campo faça o seguinte:
Coloque após a linha 01:
$(“form”).find(“input:first”).focus();
Para setar no campo adicionado:
Coloque após a linha 18:
novoCampo.find(“input:first”).focus();
Veja só:
Detalhes dos erros da página da Web
Mensagem: Caractere inválido
Linha: 3
Caractere: 4
Código: 0
// JavaScript Document
$(function () {
$(“form”).find(“input:first”).focus();
function removeCampo() {
$(“.removerCampo”).unbind(“click”);
$(“.removerCampo”).bind(“click”, function () {
i=0;
$(“.categorias p.campoCategoria”).each(function () {
i++;
});
if (i>1) {
$(this).parent().remove();
}
});
}
removeCampo();
$(“.addCampo”).click(function () {
novoCampo = $(“.categorias p.campoCategoria:first”).clone();
novoCampo.find(“input”).val(“”);
novoCampo.insertAfter(“.categorias p.campoCategoria:last”);
novoCampo.find(“input:first”).focus();
removeCampo();
});
});
$(function () {
function removeCampo() {
$(“.removerCampo”).unbind(“click”);
$(“.removerCampo”).bind(“click”, function () {
i=0;
$(“.telefones tr.campoTelefone”).each(function () {
i++;
});
if (i>1) {
$(this).parent().remove();
}
});
}
removeCampo();
$(“.adicionarCampo”).click(function () {
novoCampo = $(“.telefones tr.campoTelefone:first”).clone();
novoCampo.find(“input”).val(“”);
novoCampo.insertAfter(“.telefones tr.campoTelefone:last”);
removeCampo();
});
});
$(function () {
function removeCampo() {
$(“.removerCampo”).unbind(“click”);
$(“.removerCampo”).bind(“click”, function () {
i=0;
$(“.telefones tr.campoTelefone”).each(function () {
i++;
});
if (i>1) {
$(this).parent().remove();
}
});
}
removeCampo();
$(“.adicionarCampo”).click(function () {
novoCampo = $(“.telefones tr.campoTelefone:first”).clone();
novoCampo.find(“input”).val(“”);
novoCampo.insertAfter(“.telefones tr.campoTelefone:last”);
removeCampo();
});
});
Basta colocar um id na tr e trocar a linha
$(this).parent().remove();
por
$(‘#dados’).remove();
Agradeço esse script pois me salvou. Muito grato.
novoCampo.find(“input”).name(“input”+i);
isso?
Consegui implementa-lo perfeitamente!!!!
OBRIGADO MESMO!!!!
Faça o seguinte:
int valor = 0
$(“.campoTelefone”).each(function () {
valor += $(this).val();
});
alert(valor);
$(“#mainForm”).hover(function(){
$(“input[name=vs[]]”).val().each(function () {
valor += J(this).val();
});
J(“#total”).attr(‘value’, valor); // total
});
por favor coloque seu código junto com o HTML no http://www.jsfiddle.net/ e me mande o link para que eu possa analizar melhor
Só preciso somar todos os campos criados dinamicamento na verdade um array
J(“.soma”).blur(function(){
var total_par = 0;
J(“.soma”).each(function(){
var digitados = J(this).val();
// converter
var dig1 = digitados.replace(“.”, “”);
var dig2 = dig1.replace(“,”, “.”);
total_par += parseFloat(dig2);
}); //fim each
var resultado_p = total_par;
var resultado_p = resultado_p.toFixed(2);
var resultado_p = number_format (resultado_p, 2, ‘,’, ‘.’);
J(“#total_parcelas”).html(““+resultado_p+”“);
}); //fim blur
Att Gilberto
primeiro obrigado pelo script excelente!
estou usando este script junto com uma operação em ajax que traz uma lista de cidades a partir de um estado selecionado. esse campo é um array e preciso que a cada vez que seja clonado, seja atribuido 1 ao contador. como poderia ser isso? fiz inumeras tentativas mas todas sem sucesso.
desde já obrigado!
você pode postar um exemplo do seu código no jsfiddle.net
para que eu possa entender melhor sua pergunta?
a quantidade de endreços que o usuario adicionou?
esse ai é o link, eu preciso que na hora que eu clicar em ADICIONAR ITEM ele abra um novo campo com os selects vindo do banco de dados os campos são:
Itens vistoriados:
Cor:
Condição:
Material:
Observação:
de uma olhada por favor.
http://www.jsfiddle.net/HAQJC/9/
Retirei as partes em PHP para você ver funcionando, você deve colocar elas de novo…
os names desses campos devem ser no padrão: name[] por exemplo: name=”observacao[]”
assim você vai receber um array no seu PHP
espero que tenha ajudado….
Deus te abençoe…
Se esse post estiver ativo ainda, gostaria que você desse uma olhada nesse código: http://jsfiddle.net/3kduC/2/
Estou a 3 dias tentado resolver os bugs desse formulário, utilizo o jquery.validate para validar os campos antes do submit, porém quando o formulário é criado dinamicamente, a validação não é aplicada corretamente.
Se puder ajudar eu agradeço.
Amigos, sou novo no mundo da linguagem de programação web..
E estou com sérios problemas para inserir os dados no banco dados, alguém poderia me ajudar?
Desde já MUITO obrigado!
Uma alternativa para as linhas 5-6-7-8-9-10-11:
if($(“.telefones p.campoTelefone”).length > 1){
$(this).parent().remove();
}
Mas fiquei com uma dúvida que não consigo imaginar como solucionar – você ensinou a salvar no banco de dados, massa. Mas, há como no futuro recuperar essas informações do banco e preencher os campos?
Por exemplo, uma pessoa tem seu cadastro com 4 números, e ela irá editá-los agora. Há como recuperar esses 4 registros e colocar cada um em seu input para que a pessoa possa editar os necessários?
Se possível, me indique uma leitura. Fico muito grato por sua ajuda, obrigado.
Só tem três linhas e adiciona campos corretamente e mais eficiente que o post principal… mas valeu a informação!!!
Abraços,
só estou com um probleminha que não consigo resolver.
Nos campos adicionados não consigo colocar a mascara de telefone…
tem alguma ideia de como fazer isso?
Att,Priscilla
Me auxiliou bastante esse site no desenvolvimento de alguns exercícios, é que sou novo nessa área e tenho grande interesse de me aprofundar nos conteúdos.
$(function () {
function removeCampo() {
$(“.removerCampo”).unbind(“click”);
$(“.removerCampo”).bind(“click”, function () {
i=0;
$(“.telefones p.campoTelefone”).each(function () {
i++;
});
if (i>1) {
$(this).parent().remove();
}
});
}
removeCampo();
$(“.adicionarCampo”).click(function () {
novoCampo = $(“.sua_div:first”).clone();
novoCampo.insertAfter(“.sua_div:last”);
removeCampo();
});
});
Onde está “sua_div” troque pela classe da DIV que está usando para organizar os campos. Tudo o que estiver dentro dela será clonado.
Aproveitando, o código para recuperar os dados pode ser tão simples quanto:
Sds
Preciso alterar o nome dos campos para outro (campoEndereco). Só que o código não funciona com os campos com o nome de “campoTelefone”.
Mudei também o nome das classes e do vetor telefone[].
Pq isso acontece?