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?

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);

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


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;

});

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

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) {
    // ...
}

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

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);

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);

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.