Vous vous demandez s'il existe une fonction en javascript sans jquery ou tout autre framework qui me permette de sérialiser le formulaire et d'accéder à la version sérialisée?
javascript
forms
serialization
RussellHarrower
la source
la source
Réponses:
La bibliothèque miniature from-serialize ne repose pas sur un framework. À part quelque chose comme ça, vous devrez implémenter vous-même la fonction de sérialisation. (mais avec un poids de 1,2 kilo-octets, pourquoi ne pas l'utiliser?)
la source
case 'email':
That's an error
Voici une approche JavaScript pure:
Bien que cela semble fonctionner uniquement pour les demandes POST.
https://developer.mozilla.org/en-US/docs/Web/API/FormData
la source
req.open("POST", "<your-url>");
avantreq.send(data);
Sinon, j'ai eu l'erreurInvalidStateError: XMLHttpRequest state must be OPENED.
sur Firefox 66. Cela devrait fonctionner avec d'autres requêtes aussi comme PUT si vous remplacez POST par PUT.Pour les navigateurs modernes uniquement
Si vous ciblez les navigateurs prenant en charge l'
URLSearchParams
API ( les navigateurs les plus récents ) et leFormData(formElement)
constructeur ( les navigateurs les plus récents sauf Edge ), utilisez ceci:Partout sauf IE
Pour les navigateurs qui prennent en charge
URLSearchParams
mais pas leFormData(formElement)
constructeur, utilisez ce polyfill FormData et ce code (fonctionne partout sauf IE):Exemple
Afficher l'extrait de code
Compatible avec IE 10
Pour les navigateurs encore plus anciens (par exemple IE 10), utilisez le polyfill FormData , un
Array.from
polyfill si nécessaire et ce code:la source
.toString()
vraiment nécessaire ici?URLSearchParams
, alors oui. La conversion de chaîne se produit également implicitement si vous l'interpolez ou l'ajoutez à une chaîne, auquel cas l'toString
appel explicite n'est pas nécessaire.new FormData(formElement)
- être n'y est-il pas encore pris en charge?Source: http://code.google.com/p/form-serialize/source/browse/trunk/serialize-0.1.js
la source
Voici une version légèrement modifiée de TibTibs ':
Les champs désactivés sont ignorés et les noms sont également encodés en URL. Le remplacement de l'expression régulière de% 20 caractères n'a lieu qu'une seule fois, avant de renvoyer la chaîne.
La chaîne de requête est sous une forme identique au résultat de la méthode $ .serialize () de jQuery.
la source
form.nodeName.toLowerCase() == "form"
place deform.nodeName == "FORM"
J'ai commencé par la réponse de Johndave Decano.
Cela devrait résoudre quelques-uns des problèmes mentionnés dans les réponses à sa fonction.
Les types de bouton seront toujours ignorés s'ils n'ont pas de valeur de nom.
C'est ainsi que j'utilise actuellement cette fonction.
la source
Si vous devez soumettre le formulaire "myForm" en utilisant POST au format json, vous pouvez faire:
La deuxième ligne convertit à partir d'un tableau comme:
... dans un objet régulier, comme:
... il effectue cette conversion en passant un mapFn dans Array.from (). Cette mapFn est appliquée à chaque paire ["a", "b"] et les convertit en {"a": "b"} afin que le tableau contienne beaucoup d'objets avec une seule propriété dans chacun. Le mapFn utilise la "déstructuration" pour obtenir les noms des première et deuxième parties de la paire, et il utilise également un ES6 "ComputedPropertyName" pour définir le nom de propriété dans l'objet retourné par le mapFn (c'est pourquoi il est dit "[ x]: quelque chose "plutôt que simplement" x: quelque chose ".
Tous ces objets de propriété uniques sont ensuite passés en arguments de la fonction Object.assign () qui fusionne tous les objets de propriété uniques en un seul objet qui a toutes les propriétés.
Array.fr de (): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
Destructuration dans les paramètres: https://simonsmith.io/destructuring-objects-as-function-parameters-in-es6/
Plus d'informations sur les noms de propriété calculés ici: Variable comme nom de propriété dans un littéral d'objet JavaScript?
la source
Fonctionne dans tous les navigateurs.
la source
Pour utiliser comme ceci:
J'espère avoir aidé.
la source
Si vous cherchez à sérialiser les entrées sur un événement. Voici une approche JavaScript pure que j'utilise.
Les données seront un objet JavaScript des entrées.
la source
Une version refactorisée du code de @ SimonSteinberger utilisant moins de variables et tirant parti de la vitesse des
forEach
boucles (qui sont un peu plus rapides quefor
s)la source
J'ai refactoré la réponse TibTibs en quelque chose de beaucoup plus clair à lire. C'est un peu plus long à cause de la largeur de 80 caractères et de quelques commentaires.
En outre, il ignore les noms de champs vides et les valeurs vides.
la source
evt = evt || window.event || { target: null };
(comme l'édition l'a fait) Le but derrière cela est de transmettre l'événement qui a déclenché la sérialisation, s'il y en a un, comme un formulaire "soumettre" un événement ou un "clic" sur un bouton. Si un formulaire a plusieurs boutons pour l'envoi, vous ne voulez tenir compte que de la valeur du bouton qui a déclenché l'événement et ignorer les autres. J'ai hacké un exemple très rudimentaire de ce comportement sur dump.bedmonds.net/serialize-jsla source
J'ai récupéré la méthode entries () de formData de @moison answer et de MDN, il est dit que:
mais le seul problème est que le navigateur mobile (Android et Safari ne sont pas pris en charge) et le bureau IE et Safari également
mais en gros voici mon approche:
le code peut être trouvé ici
la source
L'utilisation de la fonction de réduction de JavaScript devrait faire une astuce pour tous les navigateurs, y compris IE9>:
Exemple en direct ci-dessous.
Afficher l'extrait de code
la source
J'espère que cela fonctionnera
la source
Améliorer la réponse de David Lemon.
Cela convertit les données du formulaire en JSON et vous permet de définir le formulaire à partir d'un objet de données.
la source
Cela pourrait être fait par une fonction très simple comme suit
la source
Voici une approche JavaScript pure:
la source
la source
À des fins de débogage, cela peut vous aider:
la source
Je pourrais être fou mais je trouve ces réponses sérieusement gonflées. Voici ma solution
la source
select
, et tout