jQuery post () avec sérialisation et données supplémentaires


147

J'essaie de savoir s'il est possible de publier serialize()et d'autres données en dehors du formulaire.

Voici ce que je pensais fonctionner, mais il envoie uniquement 'wordlist'et non les données du formulaire.

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

Quelqu'un a-t-il une idée?

Réponses:


329

Vous pouvez utiliser serializeArray [docs] et ajouter les données supplémentaires:

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

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

11
Hmm. Je pense que j'aime mieux ça que ma solution :) Je pourrais commencer à faire ça à l'avenir.
Michael Mior

@Gudradain: Cela fonctionne très bien: jsfiddle.net/fnjncqhv . Si cela ne fonctionne pas pour vous, vous êtes confronté à un problème différent.
Felix Kling

Non, ce n'est pas le cas. jsfiddle.net/fnjncqhv/1 serializeArray () produit un tableau d'objets, chaque objet contenant une seule propriété, si votre objet de données contient plus d'une propriété (comme dans votre exemple), il produit un objet invalide et ne sera pas lié côté serveur. Veuillez modifier votre réponse pour résoudre le problème.
Gudradain

2
@Gudradain: S'il vous plaît voir mon commentaire sur votre réponse. Vous avez tort. serializeArrayne produit pas la structure que vous pensez qu'il fait. Je ne suis pas sûr de ce que vous essayez de montrer avec votre démo. Vous alertez simplement la longueur du tableau. Si ma démo ne vous convainc pas, veuillez consulter la documentation .
Felix Kling

1
@FelixKling Désolé pour ce moment d'échec et merci pour l'explication. Je ne savais pas que vous aviez vraiment besoin du format {name: 'your-paramater-name', value: 'your-parameter-value'}, pour chaque paramètre que vous souhaitez ajouter.
Gudradain


9

Une solution alternative, au cas où vous auriez besoin de le faire sur un téléchargement de fichier ajax:

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

OU encore plus simple.

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

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

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

    return false;

});

5

Lorsque vous souhaitez ajouter un objet javascript aux données du formulaire, vous pouvez utiliser le code suivant

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

Ou si vous ajoutez la méthode serializeObject () , vous pouvez faire ce qui suit

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

1
Cela générera essentiellement un tableau qui ressemble à [{name: 'wordlist'}, {value: wordlist}]. Ce n'est pas dans un format que jQuery comprend, donc je doute que cela fonctionne réellement.
Felix Kling

@FelixKling serializeArray () produit [{name1: 'value1'}, {name2: 'value2'}]. Si vous avez un objet data {name3: 'value3', name4: 'value4'} et le poussez dans le tableau depuis serializeArray (), vous obtenez [{name1: 'value1'}, {name2: 'value2'}, { nom3: 'valeur3', nom4: 'valeur4'}]. Le dernier objet du tableau n'est pas valide et vous n'obtiendrez pas de résultat.
Gudradain

« serializeArray()produire [{name1: 'value1'}, {name2: 'value2'}]». Non, ce n'est pas le cas: jsfiddle.net/akyz1Lcy
Felix Kling

4

Dans la nouvelle version de jquery, pourrait le faire via les étapes suivantes:

  • obtenir un tableau de paramètres via serializeArray()
  • appeler push()ou des méthodes similaires pour ajouter des paramètres supplémentaires au tableau,
  • appeler $.param(arr)pour obtenir une chaîne sérialisée, qui pourrait être utilisée comme paramètre de jquery ajax data.

Exemple de code:

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

Vous pouvez faire en sorte que le formulaire contienne les données supplémentaires sous forme de champs masqués que vous définiriez juste avant d'envoyer la requête AJAX aux valeurs correspondantes.

Une autre possibilité consiste à utiliser ce petit bijou pour sérialiser votre formulaire en un objet javascript (au lieu de string) et ajouter les données manquantes:

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

Il n'y a aucune fonction existante nommée serializeObject. Où as-tu eu ça?
Jereme causant le

1

Vous pouvez utiliser ceci

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

0

J'aime garder les objets comme des objets et ne pas faire de changement de type fou. Voici ma façon

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

si vous ne pouvez pas voir d'en haut, j'ai utilisé la fonction .concat et passé un objet avec la variable post comme 'nom' et la valeur comme 'valeur'!

J'espère que cela t'aides.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.