jQuery post () con serializzazione e dati extra


147

Sto cercando di scoprire se è possibile pubblicare serialize() e altri dati al di fuori del modulo.

Ecco cosa pensavo avrebbe funzionato, ma invia solo 'wordlist'e non i dati del modulo.

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

Qualcuno ha qualche idea?

Risposte:


329

Puoi usare serializeArray [documenti] e aggiungere i dati aggiuntivi:

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

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

11
Hmm. Penso che mi piace di più della mia soluzione :) Potrei iniziare a farlo in futuro.
Michael Mior,

@Gudradain: funziona benissimo: jsfiddle.net/fnjncqhv . Se non funziona per te, stai affrontando un problema diverso.
Felix Kling,

No non lo fa. jsfiddle.net/fnjncqhv/1 serializeArray () produce una matrice di oggetti, ogni oggetto contenente una singola proprietà, se il tuo oggetto dati contiene più di 1 proprietà (come nel tuo esempio), produce un oggetto non valido e non verrà associato il lato server. Modifica la tua risposta per risolvere il problema.
Gudradain,

2
@Gudradain: vedi il mio commento sulla tua risposta. Tui hai torto. serializeArraynon produce la struttura che pensi che faccia. Non sono sicuro di cosa stai cercando di mostrare con la tua demo. Stai solo avvisando la lunghezza dell'array. Se la mia demo non ti convince, dai un'occhiata alla documentazione .
Felix Kling,

1
@FelixKling Ci scusiamo per il momento fallito e grazie per la spiegazione. Non ti sei reso conto che hai davvero bisogno del formato {name: 'your-paramater-name', value: 'your-parameter-value'}, per ogni parametro che desideri aggiungere.
Gudradain,


9

Una soluzione alternativa, nel caso in cui sia necessario eseguire questa operazione su un caricamento di file ajax:

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

O ancora più semplice.

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

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

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

    return false;

});

5

Quando si desidera aggiungere un oggetto javascript ai dati del modulo, è possibile utilizzare il seguente codice

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

Oppure se aggiungi il metodo serializeObject () , puoi fare quanto segue

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

1
Questo genererà sostanzialmente un array che sembra [{name: 'wordlist'}, {value: wordlist}]. Non è in un formato comprensibile da jQuery, quindi dubito che funzioni davvero.
Felix Kling,

@FelixKling serializeArray () produce [{name1: 'value1'}, {name2: 'value2'}]. Se hai un oggetto dati {name3: 'value3', name4: 'value4'} e lo spinge nella matrice da serializeArray (), ottieni [{name1: 'value1'}, {name2: 'value2'}, { nome3: 'valore3', nome4: 'valore4'}]. L'ultimo oggetto nell'array non è valido e non otterrai risultati.
Gudradain,

" serializeArray()produrre [{name1: 'value1'}, {name2: 'value2'}]". No, non lo è: jsfiddle.net/akyz1Lcy
Felix Kling

4

Nella nuova versione di jquery, è possibile farlo tramite i seguenti passaggi:

  • ottenere param array via serializeArray()
  • chiamata push() o metodi simili per aggiungere parametri aggiuntivi all'array,
  • chiama $.param(arr)per ottenere una stringa serializzata, che potrebbe essere utilizzata come dataparametro di jquery ajax .

Codice di esempio:

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

È possibile che il modulo contenga i dati aggiuntivi come campi nascosti che imposteresti subito prima di inviare la richiesta AJAX ai valori corrispondenti.

Un'altra possibilità consiste nell'utilizzare questa piccola gemma per serializzare il modulo in un oggetto javascript (anziché nella stringa) e aggiungere i dati mancanti:

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

Non esiste una funzione esistente denominata serializeObject. Dove lo hai preso?
Jereme causa il

1

Puoi usare questo

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

0

Mi piace mantenere gli oggetti come oggetti e non fare alcun matto spostamento del tipo. Ecco la mia strada

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 non riesci a vedere dall'alto ho usato la funzione .concat e ho passato un oggetto con la variabile post come 'nome' e il valore come 'valore'!

Spero che questo ti aiuti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.