O método serializeArray() do jQuery é uma ferramenta poderosa para desenvolvedores que precisam extrair dados de formulários HTML e transformá-los em uma estrutura de dados JavaScript menipulável. Ao contrário de outros métodos que geram strings, este cria um array de objetos, facilitando o processamento antes do envio para o servidor.
O que é e como funciona o serializeArray()
Este método percorre os elementos do formulário (como input, textarea e select) e cria um array de objetos contendo pares de nome e valor. Ele segue as regras do W3C para "controles bem-scuedidos", o que significa que apenas elementos que possuem o atributo name e não estão desabilitados (disabled) são incluídos.
Estrutura de Retorno
O retorno é um array JSON onde cada item possui propriedades de nome (name) e valor (value). Veja um exemplo básico:
// Exemplo de retorno de um formulário simples
[
{ "name": "usuario", "value": "João Silva" },
{ "name": "email", "value": "joao@exemplo.com" },
{ "name": "biografia", "value": "Desenvolvedor Full Stack" }
]
Adicionando dados manualmente ao Array
Uma das grandes vantagens de trabalhar com serializeArray() é a flexibilidade. Se você tiver dados que não estão dentro do formulário — como o conteúdo de um editor de texto rico ou um token de segurança gerado dinamicamente — você pode simplesmente usar o método push() do JavaScript.
// Captura os dados básicos do formulário
var dadosColetados = $("#meuFormulario").serializeArray();
// Prepara uma informação externa
var metadadoAdicional = {
name: "timestamp_local",
value: new Date().getTime()
};
// Adiciona ao array original
dadosColetados.push(metadadoAdicional);
Implementação Prática em um Cenário Real
Abaixo, apresentamos uma implementação de um sistema de publicação de conteúdo. O exemplo demonstra como integrar o serializeArray() com validação de dados e envio via AJAX para um endpoint de backend.
Estrutura HTML
<form id="formPublicacao">
<div class="campo">
<label>Título da Postagem</label>
<input type="text" name="titulo_post" placeholder="Digite o título">
</div>
<div class="campo">
<label>Categoria</label>
<select name="categoria_id">
<option value="">Selecione...</option>
<option value="1">Tecnologia</option>
<option value="2">Design</option>
</select>
</div>
<div class="campo">
<label>Status</label>
<input type="radio" name="status" value="1" checked> Ativo
<input type="radio" name="status" value="0"> Inativo
</div>
<textarea id="editorConteudo" name="corpo"></textarea>
<button type="button" onclick="processarEnvio('publicar')">Publicar</button>
<button type="button" onclick="processarEnvio('rascunho')">Salvar Rascunho</button>
</form>
Lógica JavaScript com jQuery
O script abaixo gerencia a captura dos dados, injeta parâmetros extras e realiza a requisição POST.
function processarEnvio(acao) {
// Sincroniza editores externos se houver (ex: KindEditor, CKEditor)
// editor.sync();
// Serializa o formulário principal
var payload = $("#formPublicacao").serializeArray();
// Validação simples
if (!validarCamposObrigatorios(payload)) {
return false;
}
// Adiciona o tipo de ação (publicação ou rascunho) dinamicamente
payload.push({ name: "tipo_acao", value: acao });
// Envio via AJAX
$.ajax({
url: "/api/postagens/salvar",
type: "POST",
data: payload,
success: function(resposta) {
if (resposta.status === "sucesso") {
alert("Operação realizada com sucesso!");
window.location.reload();
} else {
alert("Erro: " + resposta.mensagem);
}
},
error: function() {
alert("Falha na comunicação com o servidor.");
}
});
}
function validarCamposObrigatorios(dados) {
var camposParaMapear = {};
// Converte o array em um objeto temporário para facilitar a checagem
$.each(dados, function(i, campo) {
camposParaMapear[campo.name] = campo.value;
});
if (camposParaMapear.titulo_post === "") {
alert("O título é obrigatório.");
return false;
}
if (!camposParaMapear.categoria_id) {
alert("Escolha uma categoria.");
return false;
}
return true;
}
Observações Importantes
- Arquivos: O
serializeArray()não suporta a serialização de elementos<input type="file">. Para upload de arquivos, utilize o objetoFormData. - Checkboxes: Se vários checkboxes possuírem o mesmo
name(ex:tags[]), o array resultante conterá múltiplos objetos com o mesmo nome, um para cada item selecionado. - Botões: O valor do botão que disparou o evento não é incluído automaticamente; por isso, a inserção manual via
push()é recomendada para identificar a ação do usuário.