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


106

actuellement j'ai ce qui suit:

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

Cela fonctionne bien, mais j'aimerais ajouter une valeur aux données, j'ai donc essayé

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

Mais cela n'a pas été publié correctement. Des idées sur la façon dont vous pouvez ajouter un élément à la chaîne de sérialisation? Il s'agit d'une variable de page globale qui n'est pas spécifique au formulaire.


Pouvez-vous préciser ce que signifie «qui n'a pas été publié correctement»? Qu'est-il arrivé? Qu'est-ce qui a été reçu par le serveur?
matt b

6
Cela ne devrait-il pas être le cas '&NonFormValue=' + NonFormValue?
Wesley Murch

Réponses:


103

Au lieu de

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

tu veux probablement

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

Vous devez faire attention à encoder en URL la valeur de NonFormValuesi elle peut contenir des caractères spéciaux.


1
utiliser encodeURIComponentpour s'assurer que le NonFormValuen'a pas de caractères spéciaux
Yahya Uddin

198

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 l'utiliser jQuery.param()pour le convertir en un formulaire encodé en URL. De cette façon, jQuery gère 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
C'est certainement la meilleure option - laisser la sérialisation entièrement à jQuery, tout en ayant toujours la possibilité d'ajouter de nouvelles valeurs à celles récupérées à partir du formulaire.
jcsanyi

5
C'est la meilleure façon de le faire, ne pas jouer avec des cordes
Brett Gregson

Cela devrait être la réponse acceptée. Propre et dans le bon sens
Mike Aron

7

d'abord ne devrait 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,

Votre deuxième réponse n'aurait pas le même effet que ce que la question demandait; NonFormValueserait envoyé en tant que paramètre URL, pas dans les données POSTées. Cela pourrait ne pas être idéal si a) quel que soit il fonctionne sur le côté serveur peut être affiché (par exemple , en utilisant au request.POSTlieu de request.REQUESTDjango), ou b) NonFormValueest quelque chose qui ne devrait pas apparaître dans la barre d'URL ou l' histoire soit pour des raisons de sécurité ou parce que c'est une valeur transitoire.
Leigh Brenecki

6

Ajoutez d'abord l'élément, puis sérialisez:

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

1
Cela n'a pas fonctionné pour moi aussi. Bien qu'il étende l'objet mais n'a pas fonctionné comme prévu.
punitcse

5

N'oubliez pas que vous pouvez toujours faire:

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

dans votre forme actuelle, ce qui peut être meilleur pour votre code selon le cas.


2

On peut faire comme:

data = $form.serialize() + "&foo=bar";

Par exemple:

var userData = localStorage.getItem("userFormSerializeData");
var userId = localStorage.getItem("userId");

$.ajax({
    type: "POST",
    url: postUrl,
    data: $(form).serialize() + "&" + userData + "&userId=" + userId,
    dataType: 'json',
    success: function (response) {
        //do something
    }
});

0

Vous pouvez écrire une fonction supplémentaire pour traiter les données du formulaire et vous devez ajouter vos données non formelles en tant que valeur de données dans le formulaire.Voir l'exemple:

<form method="POST" id="add-form">
    <div class="form-group required ">
        <label for="key">Enter key</label>
        <input type="text" name="key" id="key"  data-nonformdata="hai"/>
    </div>
    <div class="form-group required ">
        <label for="name">Ente Name</label>
        <input type="text" name="name" id="name"  data-nonformdata="hello"/>
    </div>
    <input type="submit" id="add-formdata-btn" value="submit">
</form>

Ajoutez ensuite cette jquery pour le traitement du formulaire

<script>
$(document).onready(function(){
    $('#add-form').submit(function(event){
        event.preventDefault();
        var formData = $("form").serializeArray();
        formData = processFormData(formData);
        // write further code here---->
    });
});
processFormData(formData)
{
    var data = formData;
    data.forEach(function(object){
        $('#add-form input').each(function(){
            if(this.name == object.name){
                var nonformData = $(this).data("nonformdata");
                formData.push({name:this.name,value:nonformData});
            }
        });
    });
    return formData;
}


0

c'est mieux:

data: [$(this).serialize(),$.param({NonFormValue: NonFormValue})].join('&')

Veuillez ajouter une description plus détaillée des raisons pour lesquelles il s'agit d'une meilleure approche.
Mark

un code de ligne et vous pouvez utiliser l'objet json pour plus de paramètres.
eugene le
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.