jQuery post () com serialização e dados extras


147

Estou tentando descobrir se é possível postar serialize()e outros dados que estão fora do formulário.

Aqui está o que eu pensei que iria funcionar, mas ele envia apenas 'wordlist'e não os dados do formulário.

$.post("page.php",( $('#myForm').serialize(), { 'wordlist': wordlist }));

Alguém tem alguma idéia?

Respostas:


329

Você pode usar serializeArray [docs] e adicionar os dados adicionais:

var data = $('#myForm').serializeArray();
data.push({name: 'wordlist', value: wordlist});

$.post("page.php", data);

11
Hmm. Acho que gosto mais disso do que minha solução :) Posso começar a fazer isso no futuro.
Michael Mior

@Gudradain: Funciona muito bem: jsfiddle.net/fnjncqhv . Se não funcionar, você está enfrentando um problema diferente.
Felix Kling

Não, não faz. jsfiddle.net/fnjncqhv/1 serializeArray () produz uma matriz de objetos, cada objeto contendo uma única propriedade; se o seu objeto de dados contiver mais de uma propriedade (como no exemplo), ele produzirá um objeto inválido e não será vinculado do lado do servidor. Edite sua resposta para corrigir o problema.
Gudradain

2
@Gudradain: Por favor, veja meu comentário sobre sua resposta. Você está errado. serializeArraynão produz a estrutura que você pensa que produz. Não tenho certeza do que você está tentando mostrar com sua demonstração. Você está apenas alertando o comprimento da matriz. Se minha demonstração não o convencer, dê uma olhada na documentação .
Felix Kling #

1
@FelixKling Desculpe pelo momento de falha e obrigado pela explicação. Você não percebeu que realmente precisava do formato {name: 'your-paramater-name', value: 'your-parameter-value'}, para todos os parâmetros que você deseja adicionar.
Gudradain


9

Uma solução alternativa, caso você precise fazer isso em um upload de arquivo ajax:

var data = new FormData( $('#form')[0] ).append( 'name' , value );

OU ainda mais simples.

$('form').on('submit',function(e){

    e.preventDefault();
    var data = new FormData( this ).append('name', value );

    // ... your ajax code here ...

    return false;

});

5

Quando você deseja adicionar um objeto javascript aos dados do formulário, pode usar o seguinte código

var data = {name1: 'value1', name2: 'value2'};
var postData = $('#my-form').serializeArray();
for (var key in data) {
    if (data.hasOwnProperty(key)) {
        postData.push({name:key, value:data[key]});
    }
}
$.post(url, postData, function(){});

Ou, se você adicionar o método serializeObject () , poderá fazer o seguinte

var data = {name1: 'value1', name2: 'value2'};
var postData = $('#my-form').serializeObject();
$.extend(postData, data);
$.post(url, postData, function(){});

1
Isso basicamente irá gerar uma matriz que se parece [{name: 'wordlist'}, {value: wordlist}]. Isso não está no formato que o jQuery entende, então duvido que isso realmente funcione.
Felix Kling

@FelixKling serializeArray () produz [{name1: 'value1'}, {name2: 'value2'}]. Se você tiver os dados de um objeto {name3: 'value3', name4: 'value4'} e o enviar para a matriz a partir de serializeArray (), você obtém [{name1: 'value1'}, {name2: 'value2'}, { nome3: 'valor3', nome4: 'valor4'}]. O último objeto na matriz é inválido e você não obterá resultado.
Gudradain

" serializeArray()produzir [{name1: 'value1'}, {name2: 'value2'}]". Não, não faz: jsfiddle.net/akyz1Lcy
Felix Kling

4

Na nova versão do jquery, poderia fazê-lo através dos seguintes passos:

  • obter matriz de parâmetros via serializeArray()
  • chamar push()ou métodos semelhantes para adicionar parâmetros adicionais à matriz,
  • chamada $.param(arr)para obter a seqüência de caracteres serializada, que pode ser usada como o dataparâmetro de jquery ajax .

Código de exemplo:

var paramArr = $("#loginForm").serializeArray();
paramArr.push( {name:'size', value:7} );
$.post("rest/account/login", $.param(paramArr), function(result) {
    // ...
}

3
$.ajax({    
    type: 'POST',  
    url: 'test.php',  
    data:$("#Test-form").serialize(),  
    dataType:'json',
     beforeSend:function(xhr, settings){
     settings.data += '&moreinfo=MoreData';
     },
    success:function(data){
            //  json response  
    },
    error: function(data) { 
        // if error occured
    }
    });

2

Você pode fazer com que o formulário contenha os dados adicionais como campos ocultos que você definiria imediatamente antes de enviar a solicitação AJAX para os valores correspondentes.

Outra possibilidade consiste em usar esta pequena jóia para serializar seu formulário em um objeto javascript (em vez de string) e adicionar os dados ausentes:

var data = $('#myForm').serializeObject();
// now add some additional stuff
data['wordlist'] = wordlist;
$.post('/page.php', data);

Não existe uma função existente nomeada serializeObject. Onde você conseguiu isso?
Jereme Causando

1

Você pode usar isso

var data = $("#myForm").serialize();
data += '&moreinfo='+JSON.stringify(wordlist);

0

Eu gosto de manter objetos como objetos e não fazer nenhuma mudança de tipo louca. Aqui está o meu caminho

var post_vars = $('#my-form').serializeArray();
$.ajax({
  url: '//site.com/script.php',
  method: 'POST',
  data: post_vars,
  complete: function() {
    $.ajax({
      url: '//site.com/script2.php',
      method: 'POST',
      data: post_vars.concat({
        name: 'EXTRA_VAR',
        value: 'WOW THIS WORKS!'
      })
    });
  }
});

se você não pode ver de cima, usei a função .concat e passei um objeto com a variável post como 'name' e o valor como 'value'!

Espero que isto ajude.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.