Passar formulário inteiro como dados na função jQuery Ajax

155

Eu tenho uma função ajax jQuery e gostaria de enviar um formulário inteiro como dados de postagem. Estamos constantemente atualizando o formulário, portanto, torna-se tedioso atualizar constantemente as entradas do formulário que devem ser enviadas na solicitação.

Brian
fonte
Moh está correto sobre FormData () e imagens. Mas para esclarecer mais. É que a serialização funciona apenas em strings (não em dados binários). a função FormData () funciona com formulários com o tipo de codificação definido como "multipart / form-data". Detalhes aqui: developer.mozilla.org/pt-BR/docs/Web/API/FormData
james kenny

Respostas:

283

Há uma função que faz exatamente isso:

http://api.jquery.com/serialize/

var data = $('form').serialize();
$.post('url', data);
Will Vousden
fonte
3
$ .post também pode chamar uma função de sucesso. $ .post ('url', dados, função () {....});
Slm
22
nota: os campos do formulário devem ter o atributo name definido, usar apenas o ID não funciona como documentado e como descobri em primeira mão.
Lance Cleveland
o que eu preciso de alguma entrada com o mesmo nome ? Quero dizer, como tê-los em filas? como posso enviar isso em uma matriz ou algo assim?
Francisco Corrales Morales
2
@FranciscoCorralesMorales nomeie suas entradas dessa maneira:person[0].firstName person[0].lastName person[1].firstName person[1].lastName
ahmehri 11/15
@ahmehri, isso é um HTML válido <input name="person[1].lastName">?
Francisco Corrales Morales
58

serialize () não é uma boa ideia se você deseja enviar um formulário com o método post. Por exemplo, se você deseja passar um arquivo via ajax, não vai funcionar.

Suponha que tenhamos um formulário com este id: "myform".

a melhor solução é criar um FormData e enviá-lo:

    var myform = document.getElementById("myform");
    var fd = new FormData(myform );
    $.ajax({
        url: "example.php",
        data: fd,
        cache: false,
        processData: false,
        contentType: false,
        type: 'POST',
        success: function (dataofconfirm) {
            // do something with the result
        }
    });
Moh Arjmandi
fonte
1
Sim, é suportado por navegadores atualizados, mas usando serializado você só pode passar seqüências de caracteres.
Moh Arjmandi
4
Talvez você deva mencionar isso em sua resposta
toesslab 19/08/2015
Obrigado por ambos var, em 2016!
Sylar
1
sua beleza! funcionou como um encanto (dados do formulário + upload de arquivo)
saibbyweb
2
não posso enfatizar isso o suficiente! tentei, form.serialize()mas simplesmente não funcionou para o upload de arquivos. new FormData(this)funcionou muito bem
Sasanka Panguluri
26

De uso geral serialize() o elemento do formulário.

Lembre-se de que várias opções <select> são serializadas sob a mesma chave, por exemplo

<select id="foo" name="foo" multiple="multiple">
    <option value="1">one</option>
    <option value="2">two</option>
    <option value="3">three</option>
</select>

resultará em uma sequência de consultas que inclui várias ocorrências do mesmo parâmetro de consulta:

[path]?foo=1&foo=2&foo=3&someotherparams...

que pode não ser o que você deseja no back-end.

Eu uso esse código JS para reduzir vários parâmetros a uma chave única separada por vírgula (copiada descaradamente da resposta de um comentarista em um tópico no lugar de John Resig):

function compress(data) {
    data = data.replace(/([^&=]+=)([^&]*)(.*?)&\1([^&]*)/g, "$1$2,$4$3");
    return /([^&=]+=).*?&\1/.test(data) ? compress(data) : data;
}

que transforma o acima em:

[path]?foo=1,2,3&someotherparams...

No seu código JS, você chamaria assim:

var inputs = compress($("#your-form").serialize());

Espero que ajude.

Nikola
fonte
Se você estiver usando PHP, é trivial analisar uma string de consulta
Lobos
Eu sei que isso é antigo, mas como você sabe quais opções foram selecionadas usando esse método?
yardpenalty.com
18

Usar

serialize ()

var str = $("form").serialize();

Serialize um formulário para uma string de consulta, que pode ser enviada para um servidor em uma solicitação Ajax.

rahul
fonte
4

Uma boa opção jQuery para fazer isso é através do FormData . Este método também é adequado ao enviar arquivos através de um formulário!

<form id='test' method='post' enctype='multipart/form-data'>
   <input type='text' name='testinput' id='testinput'>
   <button type='submit'>submit</button>
</form>

Sua função de envio no jQuery ficaria assim:

$( 'form#test' ).submit( function(){
   var data = new FormData( $( 'form#test' )[ 0 ] );

   $.ajax( {
      processData: false,
      contentType: false,

      data: data,
      dataType: 'json',
      type: $( this ).attr( 'method' );
      url: 'yourapi.php',
      success: function( feedback ){
         console.log( "the feedback from your API: " + feedback );
      }
});

Para adicionar dados ao seu formulário, você pode usar uma entrada oculta no seu formulário ou adicioná-la rapidamente:

var data = new FormData( $( 'form#test' )[ 0 ] );
data.append( 'command', 'value_for_command' );
patrick
fonte
2
Para extrair o URL do atributo "ação" do uso forma url: $(this).attr('action'),vez
rubo77
1

Você apenas precisa postar os dados. e Usando parâmetros de conjunto de funções jquery ajax. Aqui está um exemplo.

<script>
        $(function () {

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

                e.preventDefault();

                $.ajax({
                    type: 'post',
                    url: 'your_complete url',
                    data: $('form').serialize(),
                    success: function (response) {
                        //$('form')[0].reset();
                       // $("#feedback").text(response);
                        if(response=="True") {
                            $('form')[0].reset();
                            $("#feedback").text("Your information has been stored.");
                        }
                        else
                            $("#feedback").text(" Some Error has occured Errror !!! ID duplicate");
                    }
                });

            });

        });
    </script>
DANISH TAYYIB
fonte
0

As outras soluções não funcionaram para mim. Talvez o antigo DOCTYPE no projeto em que estou trabalhando evite as opções HTML5.

Minha solução:

<form id="form_1" action="result.php" method="post"
 onsubmit="sendForm(this.id);return false">
    <input type="hidden" name="something" value="1">
</form>

js:

function sendForm(form_id){
    var form = $('#'+form_id);
    $.ajax({
        type: 'POST',
        url: $(form).attr('action'),
        data: $(form).serialize(),
        success: function(result) {
            console.log(result)
        }
    });
}
rubo77
fonte