129 votes

$(this).serialize() -- Comment ajouter une valeur ?

Actuellement, j'ai les éléments suivants :

$.ajax({
    type: 'POST',
    url: this.action,
    data: $(this).serialize(),
});

Cela fonctionne bien, mais j'aimerais ajouter une valeur aux données.

$.ajax({
    type: 'POST',
    url: this.action,
    data: $(this).serialize() + '&=NonFormValue' + NonFormValue,
});

Mais ça ne s'est pas affiché correctement. Avez-vous une idée de la façon dont vous pouvez ajouter un élément à la chaîne sérialisée ? Il s'agit d'une variable globale de la page qui n'est pas spécifique au formulaire.

0 votes

Pouvez-vous préciser ce que signifie "qui n'a pas été posté correctement" ? Que s'est-il passé ? Qu'est-ce qui a été reçu par le serveur ?

8 votes

Cela ne devrait-il pas être '&NonFormValue=' + NonFormValue ?

221voto

Adam Brenecki Points 938

Bien que la réponse de matt b fonctionne, vous pouvez également utiliser .serializeArray() pour obtenir un tableau à partir des données du formulaire, le modifier, et utiliser jQuery.param() pour le convertir en un format codé en url. De cette façon, jQuery s'occupe de la sérialisation de vos données supplémentaires pour vous.

var data = $(this).serializeArray(); // convert form to array
data.push({name: "NonFormValue", value: NonFormValue});
$.ajax({
    type: 'POST',
    url: this.action,
    data: $.param(data),
});

14 votes

C'est sans aucun doute la meilleure option - laisser la sérialisation entièrement à jQuery, tout en ayant la possibilité d'ajouter de nouvelles valeurs à celles récupérées dans le formulaire.

5 votes

C'est la meilleure façon de le faire, sans jouer avec les cordes.

0 votes

Cela devrait être la réponse acceptée. Propre et correct

122voto

matt b Points 73770

Au lieu de

 data: $(this).serialize() + '&=NonFormValue' + NonFormValue,

vous voulez probablement

 data: $(this).serialize() + '&NonFormValue=' + NonFormValue,

Vous devez veiller à coder l'URL de la valeur de l'option NonFormValue s'il peut contenir des caractères spéciaux.

2 votes

Utiliser encodeURIComponent pour s'assurer que le NonFormValue ne comporte pas de caractères spéciaux

7voto

Nikhil Bhandari Points 1159

Tout d'abord, il ne faut pas

data: $(this).serialize() + '&=NonFormValue' + NonFormValue,

être

data: $(this).serialize() + '&NonFormValue=' + NonFormValue,

et deuxièmement, vous pouvez utiliser

url: this.action + '?NonFormValue=' + NonFormValue,

ou si l'action contient déjà des paramètres

url: this.action + '&NonFormValue=' + NonFormValue,

0 votes

Votre deuxième réponse n'aurait pas le même effet que celui demandé par la question ; NonFormValue sera envoyé en tant que paramètre d'URL, et non dans les données POST. Ce n'est pas forcément l'idéal si a) le serveur s'attend à ce que les données soient envoyées par POST (par exemple, si l'on utilise l'option request.POST au lieu de request.REQUEST dans Django), ou b) NonFormValue est un élément qui ne doit pas apparaître dans la barre d'adresse ou dans l'historique, soit pour des raisons de sécurité, soit parce qu'il s'agit d'une valeur transitoire.

7voto

Jonathan Points 63

N'oubliez pas que vous pouvez toujours faire :

<input type="hidden" name="NonFormName" value="NonFormValue" />

dans votre formulaire actuel, ce qui peut être mieux pour votre code selon le cas.

6voto

Mrchief Points 25418

Ajoutez d'abord l'élément et ensuite sérialisez :

$.ajax({
    type: 'POST',
    url: this.action,
    data: $.extend($(this), {'NonFormValue': NonFormValue}).serialize()
});

1 votes

Cela n'a pas fonctionné pour moi non plus. Bien qu'il étende l'objet, il ne fonctionne pas comme prévu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X