jQuery post () z serializacją i dodatkowymi danymi

147

Próbuję dowiedzieć się, czy możliwe jest publikowanie serialize()i inne dane spoza formularza.

Oto, co myślałem, że zadziała, ale wysyła tylko 'wordlist'dane formularza, a nie dane.

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

Czy ktoś ma jakieś pomysły?

Vitaliy Isikov
źródło

Odpowiedzi:

329

Możesz użyć serializeArray [docs] i dodać dodatkowe dane:

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

$.post("page.php", data);
Felix Kling
źródło
11
Hmm. Myślę, że podoba mi się to bardziej niż moje rozwiązanie :) Mogę zacząć to robić w przyszłości.
Michael Mior
@Gudradain: Działa dobrze: jsfiddle.net/fnjncqhv . Jeśli to nie zadziała, masz inny problem.
Felix Kling
Nie, nie ma. jsfiddle.net/fnjncqhv/1 serializeArray () tworzy tablicę obiektów, każdy obiekt zawiera jedną właściwość, jeśli twój obiekt danych zawiera więcej niż 1 właściwość (jak w twoim przykładzie), tworzy nieprawidłowy obiekt i nie będzie wiązany po stronie serwera. Zmień swoją odpowiedź, aby rozwiązać problem.
Gudradain
2
@Gudradain: Proszę zobaczyć mój komentarz do Twojej odpowiedzi. Mylisz się. serializeArraynie tworzy struktury, o której myślisz, że tworzy. Nie jestem pewien, co próbujesz pokazać w swoim demo. Po prostu ostrzegasz o długości tablicy. Jeśli moje demo Cię nie przekonuje, zajrzyj do dokumentacji .
Felix Kling
1
@FelixKling Przepraszamy za ten moment niepowodzenia i dziękuję za wyjaśnienie. Nie zdawałem sobie sprawy, że naprawdę potrzebujesz formatu {nazwa: „nazwa-twojego-parametru”, wartość: „wartość-twojego-parametru”}, dla każdego parametru, który chcesz dodać.
Gudradain
55

Spróbuj $ .param

$.post("page.php",( $('#myForm').serialize()+'&'+$.param({ 'wordlist': wordlist })));
Michael Mior
źródło
3
To najlepsze rozwiązanie!
Ivijan Stefan Stipić
9

Alternatywne rozwiązanie, na wypadek, gdybyś musiał to zrobić podczas przesyłania pliku Ajax:

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

LUB jeszcze prostsze.

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

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

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

    return false;

});
r3wt
źródło
5

Jeśli chcesz dodać obiekt javascript do danych formularza, możesz użyć następującego kodu

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

Lub jeśli dodasz metodę serializeObject () , możesz wykonać następujące czynności

var data = {name1: 'value1', name2: 'value2'};
var postData = $('#my-form').serializeObject();
$.extend(postData, data);
$.post(url, postData, function(){});
Gudradain
źródło
1
Zasadniczo wygeneruje to tablicę, która wygląda jak [{name: 'wordlist'}, {value: wordlist}]. To nie jest w formacie zrozumiałym dla jQuery, więc wątpię, żeby to faktycznie działało.
Felix Kling
@FelixKling serializeArray () produkuje [{nazwa1: 'wartość1'}, {nazwa2: 'wartość2'}]. Jeśli masz dane obiektu {name3: 'value3', name4: 'value4'} i wypchniesz je do tablicy z serializeArray (), otrzymasz [{name1: 'value1'}, {name2: 'value2'}, { nazwa3: 'wartość3', nazwa4: 'wartość4'}]. Ostatni obiekt w tablicy jest nieprawidłowy i nie otrzymasz wyniku.
Gudradain
serializeArray()produkować [{name1: 'value1'}, {name2: 'value2'}]”. Nie, nie działa: jsfiddle.net/akyz1Lcy
Felix Kling
4

W nowej wersji jquery można to zrobić w następujący sposób:

  • pobierz tablicę parametrów przez serializeArray()
  • połączenie push() lub podobne metody w celu dodania dodatkowych parametrów do tablicy,
  • call, $.param(arr)aby uzyskać serializowany ciąg, który może być użyty jako parametr jquery ajax data.

Przykładowy kod:

var paramArr = $("#loginForm").serializeArray();
paramArr.push( {name:'size', value:7} );
$.post("rest/account/login", $.param(paramArr), function(result) {
    // ...
}
Eric Wang
źródło
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
    }
    });
Ganesan Murugesan
źródło
2

Możesz mieć formularz zawierający dodatkowe dane jako ukryte pola, które ustawisz tuż przed wysłaniem żądania AJAX do odpowiednich wartości.

Inna możliwość polega na użyciu tego małego klejnotu do serializacji twojego formularza do obiektu javascript (zamiast ciągu) i dodania brakujących danych:

var data = $('#myForm').serializeObject();
// now add some additional stuff
data['wordlist'] = wordlist;
$.post('/page.php', data);
Darin Dimitrov
źródło
Nie ma istniejącej funkcji o nazwie serializeObject. Skąd to masz?
Jereme powodujący
1

Możesz tego użyć

var data = $("#myForm").serialize();
data += '&moreinfo='+JSON.stringify(wordlist);
Marouane B.
źródło
0

Lubię utrzymywać przedmioty jako obiekty i nie robić szalonych zmian typu. Oto moja droga

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

jeśli nie widzisz z góry, użyłem funkcji .concat i przekazałem w obiekcie zmienną post jako „nazwa” i wartość jako „wartość”!

Mam nadzieję że to pomoże.

AA Karim
źródło