Existe-t-il un moyen simple et en une ligne pour obtenir les données d'un formulaire comme il le serait s'il devait être soumis de manière classique uniquement HTML?
Par exemple:
<form>
<input type="radio" name="foo" value="1" checked="checked" />
<input type="radio" name="foo" value="0" />
<input name="bar" value="xxx" />
<select name="this">
<option value="hi" selected="selected">Hi</option>
<option value="ho">Ho</option>
</form>
Production:
{
"foo": "1",
"bar": "xxx",
"this": "hi"
}
Quelque chose comme ça est trop simple, car il n'inclut pas (correctement) les zones de texte, les sélections, les boutons radio et les cases à cocher:
$("#form input").each(function () {
data[theFieldName] = theFieldValue;
});
javascript
jquery
forms
Bart van Heukelom
la source
la source
Réponses:
démo
la source
_.object($("#myform").serializeArray().map(function(v) {return [v.name, v.value];} ))
Use
$('form').serializeArray()
, qui renvoie un tableau :Une autre option est
$('form').serialize()
, qui renvoie une chaîne :Jetez un œil à cette démo jsfiddle
la source
serializeArray
serait tellement plus utile s'ilname="multiple[]"
ne fonctionnent pas. La solution pour la méthode POST est la même, utilisez simplement $ ('form'). Serialize (). De plus, la méthode POST n'a pas de limite de 2000 caractères comme GET dans la plupart des navigateurs, elle peut donc être utilisée même pour des données assez volumineuses.name
attribut.Réponse mise à jour pour 2014: HTML5 FormData fait cela
Vous pouvez ensuite publier formData exactement tel qu'il est - il contient tous les noms et valeurs utilisés dans le formulaire.
la source
entries()
méthode [page MDN ].Basé sur
jQuery.serializeArray
, retourne des paires clé-valeur.la source
C'est une réponse épineuse, mais laissez-moi vous expliquer pourquoi c'est une meilleure solution:
Nous traitons correctement une soumission de formulaire plutôt qu'une simple pression sur un bouton. Certaines personnes aiment pousser sur les champs. Certaines personnes utilisent des périphériques d'entrée alternatifs tels que l'entrée vocale ou d'autres périphériques d'accessibilité. Manipulez le formulaire soumis et vous le résolvez correctement pour tout le monde.
Nous creusons dans les données du formulaire pour le formulaire réel qui a été soumis. Si vous modifiez votre sélecteur de formulaire ultérieurement, vous n'avez pas à modifier les sélecteurs pour tous les champs. De plus, vous pouvez avoir plusieurs formulaires avec les mêmes noms d'entrée. Pas besoin de lever l'ambiguïté avec des identifiants excessifs et ce qui ne l'est pas, il suffit de suivre les entrées en fonction du formulaire qui a été soumis. Cela vous permet également d'utiliser un seul gestionnaire d'événements pour plusieurs formulaires si cela convient à votre situation.
L'interface FormData est assez nouvelle, mais est bien prise en charge par les navigateurs. C'est un excellent moyen de créer cette collecte de données pour obtenir les vraies valeurs de ce qui est dans le formulaire. Sans cela, vous devrez parcourir tous les éléments (comme avec
form.elements
) et déterminer ce qui est vérifié, ce qui ne l'est pas, quelles sont les valeurs, etc. Tout à fait possible si vous avez besoin de l'ancien support du navigateur, mais le FormData l'interface est plus simple.J'utilise ES6 ici ... ce n'est en aucun cas une exigence, alors changez-le pour qu'il soit compatible ES5 si vous avez besoin de l'ancien support du navigateur.
la source
formData.entries()
.formData.foo
n'est pas défini. Comme vous l'avez vu dans votre réponse, il.get()
faut appeler ce qui, à mon avis, n'est pas pratique. Peut-être que "n'expose pas" est tombé dans le mauvais sens. Donc, pour générer quelque chose comme à{ foo: 'bar' }
partir d'unsubmit
événement, vous devez les parcourir manuellement. D'où le. To get a plain object from it, see [link]
.xhr.send(formData);
JSON.stringify([...formData])
Ou, si vous voulez que vos clés / valeurs soient séparées ...[...formData].reduce((prev, cur) => { prev[cur[0]] = cur[1]; return prev;}, {})
utilisez .serializeArray () pour obtenir les données au format tableau, puis convertissez-les en objet:
la source
<input type="checkbox" name="someList" value="one" /> <input type="checkbox" name="someList" value="two" />
. Si les deux sont cochés, l'objet contient uniquement la deuxième valeur de case à cocher.someList
devrait êtretype="radio"
?name:value
Voici une solution très simple et courte qui ne nécessite même pas Jquery.
la source
postData
.Nous sommes en 2019 et il existe une meilleure façon de procéder:
ou si vous voulez un objet simple à la place
mais notez que cela ne fonctionnera pas avec les clés en double comme vous le faites avec les cases à cocher à sélection multiple et en double avec le même nom.
la source
document.getElementsByClassName
et une boucle for mais bon, toujours plus agréable que d'exiger jQuery, etc.document.querySelector
au lieu de justequerySelector
.la source
à part cela, vous voudrez peut-être regarder serialize () ;
la source
J'utilise ceci:
Plugin jQuery
Formulaire HTML
Obtenez les données
la source
Array
Voici une implémentation de JavaScript uniquement qui gère correctement les cases à cocher, les boutons radio et les curseurs (probablement d'autres types d'entrée également, mais je ne les ai testés que).
Exemple de travail:
Éditer:
Si vous cherchez une implémentation plus complète, jetez un coup d'œil à cette section du projet pour lequel j'ai fait cela . Je mettrai à jour cette question avec la solution complète que j'ai trouvée, mais peut-être que cela sera utile à quelqu'un.
la source
Si vous utilisez jQuery, voici une petite fonction qui fera ce que vous cherchez.
Tout d'abord, ajoutez un ID à votre formulaire (sauf s'il s'agit du seul formulaire sur la page, vous pouvez simplement utiliser 'formulaire' comme requête dom)
La sortie ressemblerait à:
la source
Vous pouvez également utiliser les objets FormData ; L'objet FormData vous permet de compiler un ensemble de paires clé / valeur à envoyer à l'aide de XMLHttpRequest. Il est principalement destiné à être utilisé pour envoyer des données de formulaire, mais peut être utilisé indépendamment des formulaires afin de transmettre des données à clé.
la source
Cela ajoutera tous les champs du formulaire à l'objet JavaScript "res":
la source
J'ai inclus la réponse pour rendre également l'objet requis.
la source
foo[bar][] = 'qux'
devrait sérialiser vers{ foo: { bar: [ 'qux' ] } }
.Sur la base de la réponse de Neuront, j'ai créé une méthode JQuery simple qui obtient les données du formulaire par paires clé-valeur, mais cela fonctionne pour les sélections multiples et pour les entrées de tableau avec name = 'example []'.
Voici comment il est utilisé:
Vous trouverez ci-dessous un exemple de sa définition et de son fonctionnement.
la source
la source
la source
vous pouvez utiliser cette fonction pour avoir un objet ou un JSON à partir du formulaire.
pour l'utiliser:
la source
J'ai écrit une bibliothèque pour résoudre ce problème: JSONForms . Il prend une forme, parcourt chaque entrée et crée un objet JSON que vous pouvez facilement lire.
Disons que vous avez le formulaire suivant:
La transmission du formulaire à la méthode d'encodage de JSONForms vous renvoie l'objet suivant:
Voici une démo avec votre formulaire.
la source
Codepen
la source
Pour ceux d'entre vous qui préféreraient une
Object
chaîne par opposition à une chaîne sérialisée (comme celle renvoyée par$(form).serialize()
, et une légère amélioration$(form).serializeArray()
), n'hésitez pas à utiliser le code ci-dessous:Pour l'exécuter, utilisez simplement
Form.serialize(form)
et la fonction renverra unObject
semblable à ceci:En prime, cela signifie que vous n'avez pas à installer l'ensemble complet de jQuery juste pour une fonction de sérialisation.
la source
J'ai écrit une fonction qui prend en charge plusieurs cases à cocher et plusieurs sélections. Dans ces cas, il renvoie un tableau.
la source
montrant les champs des éléments d'entrée du formulaire et le fichier d'entrée pour soumettre votre formulaire sans actualiser la page et saisir toutes les valeurs avec le fichier inclus ici c'est
la source
Cela résoudra le problème: ne pouvait pas fonctionner avec des sélections multiples.
la source
Vous n'êtes pas tout à fait correct. Vous ne pouvez pas écrire:
Parce que de cette façon, si vous avez une liste multi-sélection - ses valeurs seront remplacées par la dernière, car elles sont transmises comme: "param1": "valeur1", "param1": "valeur2".
Donc, l'approche correcte est:
la source
Cette méthode devrait le faire. Il sérialise les données du formulaire, puis les convertit en objet. Prend également soin des groupes de cases à cocher.
la source
name
attribut.Voici une belle fonction JS vanille que j'ai écrite pour extraire les données du formulaire en tant qu'objet. Il a également des options pour insérer des ajouts dans l'objet et pour effacer les champs de saisie du formulaire.
Voici un exemple de son utilisation avec une demande de publication:
la source