JQuery Serializearray não pegando elementos de forma criados dinamicamente
-
26-09-2019 - |
Pergunta
Eu tenho um formulário criado dinamicamente usando o AJAX (como dados para os elementos do formulário devem vir de um banco de dados) e quero serializar os elementos do formulário a serem enviados pelo AJAX. Atualmente, estou apenas testando minha teoria usando o código do site jQuery apenas para ver se posso pegar os elementos do formulário e é aí que está o problema:
$(document).ready(function() {
$('#btnCustomSearch').live('click', function() {
$('#results').html('');
alert($('#customSearchTable :input').serializeArray());
// get all the inputs into an array.
var fields = $('#customSearchTable :input').serializeArray();
jQuery.each(fields, function(i, field) {
$("#results").append(field.name + " = " + field.value + ", ");
});
// now we'll reformat the data as we need
// here we'll send the data via ajax
});
});
Preciso fazer algumas alterações nos dados antes da submissão e esse código ainda não está escrito, mas o que estou descobrindo é que quaisquer elementos de entrada na página que existiam no momento do carregamento da página são coletados corretos, quaisquer elementos que sejam O povoado usando JavaScript é capturado corretamente, mas qualquer criado usando o AJAX é ignorado.
Eu sei que isso normalmente é resolvido usando "Live", mas não estou claro sobre como resolver isso com serializeArray()
. Usando os elementos de formulário adicional do Ajax são adicionados ao #customSearchTable
E esses são os que não estão sendo escolhidos.
Qualquer ajuda grande apreciada.
Obrigado
Solução
Vou expor o comentário um pouco mais aqui:
Quando Você ligar .serializeArray()
está percorrendo apenas como um <form>
A submissão seria ou o mais próximo possível de qualquer maneira, para que os elementos fossem enviados. A parte chave é aqui:
.filter(function() {
return this.name && !this.disabled &&
(this.checked || rselectTextarea.test(this.nodeName) ||
rinput.test(this.type));
})
Apenas como um <form>
enviar não incluiria elementos sem um name
atributo, a .filter()
ligue usando this.name
filtrará esses elementos a serem serializados.
Outras dicas
Para qualquer outra pessoa que encontre isso como um "problema", observe que, de acordo com o comentário de Nick Craver acima, tudo o que é necessário é garantir que o atributo "nome" seja anexado aos novos elementos de formulário que são criados dinamicamente. Isso resolveu meu problema! Muito obrigado, Nick!