Logo Hardware.com.br
Flag King
Flag King Novo Membro Registrado
13 Mensagens 0 Curtidas

jQuery insere novas linhas no formulário. Como populá-las automaticamente?

#1 Por Flag King 08/07/2015 - 13:53
Pessoal, eu tenho um script que adiciona linhas automaticamente em um formulário. Para isto utilizo jQuery.
A cada clique num botão, o jQuey cria uma nova linha no formulário, para preenchimento de novos dados.

Eu preciso que um campo seja populado com informaçoes baseadas em outro campo. Por exemplo:
Eu digito o código do item e aparece, automaticamente, a descrição dele.

Isto está funcionando na primeira linha, mas não fucniona nas seguintes, criadas com o jQuery.

Endereço do exemplo:
http://flagsmind.com/deltab/pedidos/4/

Códigos:

======================================================================================
HTML
======================================================================================

[code=HTML]















Pedidos





Digitar 1, 2 ou 3 no campo código.

Ao inserir nova linha, nao funciona o script popular campo.






cod_forCodigo [1, 2 ou 3]DescriçãoDatacod_valorcod_pagto num_pedcod_ped






Adicionar Item






[/code]

=============================================================================
PHP com os dados a serem populados
=============================================================================

[code=PHP]

<?php
$cpf = $_GET['cpf'];

$pessoas['1']['nome'] = "Exemplo1";
$pessoas['1']['dataNascimento'] = "16/06/1986";

$pessoas['2']['nome'] = "Exemplo2";
$pessoas['2']['dataNascimento'] = "20/01/1932";

$pessoas['3']['nome'] = "Exemplo3";
$pessoas['3']['dataNascimento'] = "23/04/1914";

echo $pessoas[$cpf]['nome'] ."-". $pessoas[$cpf]['dataNascimento'];
?>

[/code]

===================================================================
SCRIPTS:
===================================================================

[code=javascript]

// JavaScript Document

//Executa quando todo DOM(Árvore de elementos HTML) for carregado
jQuery(function(){

jQuery.AddRow();

jQuery('#button-add').click(function(e){

e.preventDefault(); //anula a ação padrão do elemento, neste caso impede que o formulario seja enviado ao click deste botão

jQuery.AddRow(); // chamada da função que insere a nova linha;

});

jQuery('#grid-produtos tbody :text').live('change',function(){

jQuerytr = jQuery(this).closest('tr');

if ( jQuery(this).val() != '' )
jQuerytr.removeClass('linha_vazia');

qtd_colunas = jQuery(this).closest('tr').find('td').length - 1;
jQuerytd = jQuery(this).closest('td');

if( jQuerytd.index() != qtd_colunas )
{
jQuery(this).closest('td').next().find(':text').focus();
}
else
{
if ( jQuery('.linha_vazia').length == 0 )
jQuery.AddRow();
else
jQuery(this).closest('tr').next().find(':text:first').focus();
}
});

jQuery('#button-submit').click(function(){
jQuery('#form-produtos').submit();
})



})



/*
* Função: AddRow ( Adiciona Linha )
* Descrição: Insere uma nova linha no formulário
*/
jQuery.AddRow = function(){

//Recuperando o tbody da table onde será inserido a nova linha
jQuerytarget = jQuery('#grid-produtos tbody');

//Montando o html da nova linha'
jQuerynova_linha = jQuery('' +


'' +
'' +
'' +

'' +
'' +
'' +

'' +
'' +
'' +

'' +
'' +
'' +

'' +
'' +
'' +

'' +
'' +
'' +

'' +
'' +
'' +

'' +
'' +
'' +

'');



jQuerytarget.append( jQuerynova_linha );

jQuerynova_linha.find(':text:first').focus();

//inserindo na tabela a nova linha
//jQuerynova_linha.find('input[type="text"]:first').focus();



}


//Outra função inserindo aqui nesta mesma página.

$(function () {

$("#cpf").blur(function () {

var cpf = $(this).val();

$.ajax({

type: "GET",

url: "pessoas.php",

data: "cpf="+cpf,

success: function(pessoa){

informacoesPessoa = pessoa.split("-");

$("#nome").val(informacoesPessoa[0]);

$("#dataNascimento").val(informacoesPessoa[1]);

}

});

});

});


[/code]

==================================================================================
Como posso fazer pra que as novas linhas também populem a partir do campo Código?
esquiloesperto
esquiloesper... Cyber Highlander Moderador
7.1K Mensagens 2.2K Curtidas
#2 Por esquiloesper...
11/07/2015 - 18:07
Amigo, é simples a solução.

Lembre-se de que o atributo ID de cada elemento em um documento deve ser único mesmo quando há repetições, e isto significa que cada nova linha criada precisa ter seus IDs diferentes da linha anterior. Você parece ter esquecido de tratar isso.
Corrija este detalhe e tudo funcionará como deve. (tip: 'Use um índice')
Flag King
Flag King Novo Membro Registrado
13 Mensagens 0 Curtidas
#3 Por Flag King
13/07/2015 - 10:21
Obrigado pela ajuda, amigo!

O escript não é meu, eu só adaptei. Não consegui criar uma ID nova a cada repetição pq o segredo do input no MySQL é um dos campos. A cada campo igual, o MySQL trata como um novo input de daods, criando uma nova linha. Desta forma, creio que não há um ID diferente pra cada uma.
Sendo assim, o que acontece é que a cada linha nova criada, o ID a ser populado continua na primeira, apenas.
Ainda não consegui tratar isso.
esquiloesperto
esquiloesper... Cyber Highlander Moderador
7.1K Mensagens 2.2K Curtidas
#4 Por esquiloesper...
14/07/2015 - 00:08
Isto acontece exatamente por causa daquilo que eu já descrevi antes.

Justamente para fomentar o conhecimento e o raciocínio lógico, aqui na Comunidade GDH não temos o hábito de passar códigos prontos; Entretanto, neste caso não vejo outra saída senão apresentar uma dentre outras soluções:
[LIST=1]
Para isso chamei de "nova" uma variável criada para a nova_linha, a qual deve ser inserida precisamente no lugar onde existiam colchetes (é para isto que eles estavam lá)
Por fim, modifiquei a última função acionada por um evento 'onblur' acrescentado diretamente no input "CPF" em cada nova linha adicionada
Não apenas os IDs devem ser únicos em um documento, mas obrigatoriamente em um formulário cada NAME também precisa ser único
[/LIST]
...
[code=JavaScript]
/*
* Função: AddRow ( Adiciona Linha )
* Descrição: Insere uma nova linha no formulário
*/

var nova = 0;

jQuery.AddRow = function(){

//Recuperando o tbody da table onde será inserido a nova linha
jQuerytarget = jQuery('#grid-produtos tbody');

//Montando o html da nova linha'
jQuerynova_linha = jQuery(' ' +
'' +
' ' +
'' +
' ' +
'' +
' ' +
'' +
' ' +
'' +
' ' +
'' +
' ' +
'' +
' ' +
'' +
' ');

nova++;

jQuerytarget.append( jQuerynova_linha );
jQuerynova_linha.find(':text:first').focus();

//inserindo na tabela a nova linha
//jQuerynova_linha.find('input[type="text"]:first').focus();
}

function fill(elem) {
var cpf = elem.value;
var pos = elem.id.substr(-1);

$.ajax({
type: "GET",
url: "pessoas.php",
data: "cpf="+cpf,
success: function(pessoa){
informacoesPessoa = pessoa.split("-");
$("#nome"+pos).val(informacoesPessoa[0]);
$("#dataNascimento"+pos).val(informacoesPessoa[1]);
}
});
};
[/code]
Flag King
Flag King Novo Membro Registrado
13 Mensagens 0 Curtidas
#7 Por Flag King
16/07/2015 - 11:25
esquiloesperto e demais amigos;

Seguindo o pensamento do esquiloesperto sobre buscar a solução ao invés de postar códigos prontos, resolvi ir atrás de um pequeno problema que apareceu no moento do inpt destes dados no MySQL.

Ao utilizar o código acima, todas as linhas são populadas, mas o input não acontecia. Fiz alguns testes e cheguei ao seguinte resultado:
O código estava assim:
[code=javascript]
''+
[/code]

Eu troquei para isto:

[code=javascript]
''+
[/code]

Somente retirei a função '+nova+' do atributo NAME. Desta forma, o input, que trata a multiplicaçao de linhas pelo [], passou a funcionar. E os campos são populados pelo id, então aparentemente ficou tudo certo.

Estou no caminho ou errei alguma coisa?


Grande abraço!
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal