Utilizando o método serializeArray() do jQuery para submissão de formulários via AJAX

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 objeto FormData.
  • 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.

Tags: jQuery ajax javascript front-end JSON

Publicado em 7-12 23:45