Comment ajouter des champs supplémentaires au formulaire avant de le soumettre?

111

Existe-t-il un moyen d'utiliser javascript et JQuery pour ajouter des champs supplémentaires à envoyer à partir d'un formulaire HTTP à l'aide de POST?

Je veux dire:

<form action="somewhere" method="POST" id="form">
  <input type="submit" name="submit" value="Send" />
</form>

<script type="text/javascript">
  $("#form").submit( function(eventObj) {
    // I want to add a field "field" with value "value" here
    // to the POST data

    return true;
  });
</script>
Effrayer
la source

Réponses:

161

Oui, vous pouvez essayer avec des paramètres cachés.

  $("#form").submit( function(eventObj) {
      $("<input />").attr("type", "hidden")
          .attr("name", "something")
          .attr("value", "something")
          .appendTo("#form");
      return true;
  });
Suresh Atta
la source
30
.appendTo(this)serait probablement mieux.
jcuenod
4
@jcuenod original appendTo('#form')est bien meilleur, car une telle approche permet de soumettre un autre formulaire avec les valeurs de celui-ci.
Andremoniy
7
Vous devrez ajouter une logique supplémentaire pour éviter d'accumuler ces entrées à chaque soumission.
amos
Vous voudrez probablement supprimer l'élément d'entrée avant de l'ajouter au cas où il existe déjà$(this).find("input[name="+"something"+"]").remove();
K Vij
42

Essaye ça:

$('#form').submit(function(eventObj) {
    $(this).append('<input type="hidden" name="field_name" value="value" /> ');
    return true;
});
Khawer Zeshan
la source
J'ai besoin d'ajouter un champ de fichier de manière dynamique. J'ai essayé d'avoir type = file, et la valeur également en tant que fichier (j'utilise WebKitDirectory, donc j'obtiens en fait les objets fichier), mais il ne semble jamais le passer. Le texte d'entrée est toujours transmis cependant. Sil te plait aide moi!
Swaathi Kakarla
Ma réponse préférée en raison de l'utilisation thisau lieu du redondant#form
rinogo
15
$('#form').append('<input type="text" value="'+yourValue+'" />');
de_nuit
la source
10

Vous pouvez ajouter un hidden inputavec la valeur que vous devez envoyer:

$('#form').submit(function(eventObj) {
    $(this).append('<input type="hidden" name="someName" value="someValue">');
    return true;
});
Mohammad Adil
la source
5

Cela marche:

var form = $(this).closest('form');

form = form.serializeArray();

form = form.concat([
    {name: "customer_id", value: window.username},
    {name: "post_action", value: "Update Information"}
]);

$.post('/change-user-details', form, function(d) {
    if (d.error) {
        alert("There was a problem updating your user details")
    } 
});
Jeff Lowery
la source
Ouais, mais il n'y a pas de redirection vers la page de résultats.
omikron
3
cela devrait fonctionner: $('body').append(form); $(form).submit();
Jeff Lowery
Cela m'a été le plus utile, car j'ai un grand nombre de champs générés et je ne veux pas créer de champs masqués pour chacun.
Sprachprofi le
Pourquoi pas @Sprachprofi?
Displee
3

Peut être utile pour certains:

(une fonction qui vous permet d'ajouter les données au formulaire en utilisant un objet, avec substitution pour les entrées existantes, s'il y en a) [pure js]

(la forme est un domaine, et non un objet jquery [ jqryobj.get (0) si vous avez besoin ])

function addDataToForm(form, data) {
    if(typeof form === 'string') {
        if(form[0] === '#') form = form.slice(1);
        form = document.getElementById(form);
    }

    var keys = Object.keys(data);
    var name;
    var value;
    var input;

    for (var i = 0; i < keys.length; i++) {
        name = keys[i];
        // removing the inputs with the name if already exists [overide]
        // console.log(form);
        Array.prototype.forEach.call(form.elements, function (inpt) {
             if(inpt.name === name) {
                 inpt.parentNode.removeChild(inpt);
             }
        });

        value = data[name];
        input = document.createElement('input');
        input.setAttribute('name', name);
        input.setAttribute('value', value);
        input.setAttribute('type', 'hidden');

        form.appendChild(input);
    }

    return form;
}

Utilisation :

addDataToForm(form, {
    'uri': window.location.href,
     'kpi_val': 150,
     //...
});

tu peux aussi l'utiliser comme ça

var form = addDataToForm('myFormId', {
    'uri': window.location.href,
     'kpi_val': 150,
     //...
});

vous pouvez ajouter # si vous le souhaitez aussi ("#myformid").

Mohamed Allal
la source