Przekaż cały formularz jako dane w funkcji jQuery Ajax

155

Mam funkcję jQuery ajax i chciałbym przesłać cały formularz jako dane pocztowe. Stale aktualizujemy formularz, więc ciągłe aktualizowanie danych wejściowych formularza, które powinny być wysyłane w żądaniu, staje się uciążliwe.

Brian
źródło
Moh ma rację co do FormData () i obrazów. Ale żeby wyjaśnić dalej. Chodzi o to, że serializacja działa tylko na łańcuchach (nie na danych binarnych). funkcja FormData () działa z formularzami, których typ kodowania jest ustawiony na „multipart / form-data”. Szczegóły tutaj: developer.mozilla.org/en-US/docs/Web/API/FormData
james kenny

Odpowiedzi:

283

Jest funkcja, która robi dokładnie to:

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

var data = $('form').serialize();
$.post('url', data);
Will Vousden
źródło
3
$ .post może również wywołać funkcję w przypadku sukcesu. $ .post ('url', dane, funkcja () {....});
slm
22
uwaga: pola formularza muszą mieć ustawiony atrybut nazwy, używanie samego ID nie działa zgodnie z dokumentacją i jak się dowiedziałem z pierwszej ręki.
Lance Cleveland
czego potrzebuję jakieś dane wejściowe o tej samej nazwie ? To znaczy, jakbyś miał je w rzędach? jak mogę wysłać to w tablicy czy coś?
Francisco Corrales Morales
2
@FranciscoCorralesMorales nazwij swoje dane wejściowe w ten sposób:person[0].firstName person[0].lastName person[1].firstName person[1].lastName
ahmehri
@ahmehri, czy to jest prawidłowy kod HTML <input name="person[1].lastName">?
Francisco Corrales Morales
58

serialize () nie jest dobrym pomysłem, jeśli chcesz wysłać formularz metodą post. Na przykład, jeśli chcesz przekazać plik przez ajax, to nie zadziała.

Załóżmy, że mamy formularz o tym id: „myform”.

lepszym rozwiązaniem jest zrobienie FormData i wysłanie go:

    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
źródło
1
Tak, jest obsługiwany przez zaktualizowane przeglądarki, ale używając serializacji można przekazywać tylko ciągi.
Moh Arjmandi,
4
Może powinieneś wspomnieć o tym w swojej odpowiedzi
toesslab
Dziękuję za jedno vari drugie w 2016 roku!
Sylar
1
jesteś piękna! działało jak urok (dane formularzy + przesyłanie plików)
saibbyweb
2
nie mogę tego wystarczająco podkreślić! próbowałem, form.serialize()ale po prostu nie działało w przypadku przesyłania plików. new FormData(this)działało ładnie
Sasanka Panguluri
26

Ogólnie używane serialize()w elemencie formularza.

Należy pamiętać, że wiele opcji <select> jest serializowanych pod tym samym kluczem, np

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

spowoduje powstanie ciągu zapytania zawierającego wiele wystąpień tego samego parametru zapytania:

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

co może nie być tym, czego oczekujesz od zaplecza.

Używam tego kodu JS, aby zredukować wiele parametrów do pojedynczego klucza oddzielonego przecinkami (bezwstydnie skopiowanego z odpowiedzi komentatora w wątku u Johna Resiga):

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

co zamienia powyższe w:

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

W swoim kodzie JS nazwałbyś to tak:

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

Mam nadzieję, że to pomoże.

nikola
źródło
Jeśli używasz PHP, parsowanie kwerendy za pomocą funkcji parse_url jest trywialne: us3.php.net/manual/en/function.parse-url.php
Lobos
Wiem, że to jest stare, ale skąd wiesz, które opcje zostały wybrane przy użyciu tej metody?
yardpenalty.com
18

Posługiwać się

serialize ()

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

Serializuj formularz do ciągu zapytania, który może zostać wysłany do serwera w żądaniu Ajax.

rahul
źródło
3

Dobrą opcją jQuery do tego jest użycie FormData . Ta metoda jest również przydatna podczas wysyłania plików przez formularz!

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

Twoja funkcja wysyłania w jQuery wyglądałaby tak:

$( '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 );
      }
});

aby dodać dane do formularza, możesz użyć ukrytych danych wejściowych w formularzu lub dodać je w locie:

var data = new FormData( $( 'form#test' )[ 0 ] );
data.append( 'command', 'value_for_command' );
patrick
źródło
2
Aby wyodrębnić adres URL z atrybutu „action” formularza, użyj url: $(this).attr('action'),zamiast tego
rubo77
1

Musisz tylko opublikować dane. i Używanie parametrów zestawu funkcji jquery ajax. Oto przykład.

<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>
DUŃSKI TAYYIB
źródło
0

Inne rozwiązania nie działały dla mnie. Może stary DOCTYPE w projekcie, nad którym pracuję, blokuje opcje HTML5.

Moje rozwiązanie:

<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
źródło