FormData

Rassemble les valeurs des champs d’un formulaire en paires nom-valeur. L’objet obtenu peut être lu ou envoyé au serveur avec fetch().

Renvoie
Un nouvel objet FormData.
Sur cette page

Exemple

#
JavaScript
const form = document.querySelector('#signup')
const data = new FormData(form)

console.log(data.get('nick'))
console.log(data.get('course'))
console.log(data.get('newsletter'))
console.log(data.get('code'))
console.log(Object.fromEntries(data))
Console
Léa
js
on
null
{ nick: 'Léa', course: 'js', newsletter: 'on' }

Une case cochée sans attribut value a la valeur "on". Le champ désactivé code n’atteint pas du tout les données, donc get() renvoie null pour lui.

Définition et utilisation

#

Le constructeur new FormData(form) lit tous les champs du formulaire qui ont un attribut name, et les enregistre sous forme de paires nom-valeur. Vous n’avez pas besoin de récupérer chaque champ séparément : le texte des champs, les cases cochées, les options choisies dans les listes et les fichiers atterrissent tous dans un seul objet. Les champs désactivés (disabled) et les cases non cochées sont ignorés.

La méthode get(nom) renvoie la valeur d’un champ (une chaîne ou un fichier) ou null, getAll() renvoie toutes les valeurs portant ce nom, par exemple de plusieurs cases cochées, et has(), set(), append() et delete() permettent de vérifier et de modifier les données. Object.fromEntries(formData) les transforme en objet ordinaire, mais pour des noms répétés, seule la dernière valeur reste.

Un objet FormData transmis comme body à fetch() est envoyé au format multipart/form-data, le même que celui utilisé par un formulaire ordinaire avec des fichiers. Ne définissez pas l’en-tête Content-Type à la main dans ce cas, car le navigateur doit y ajouter la frontière qui sépare les champs. Si le serveur attend du JSON, convertissez les données en objet ordinaire et envoyez-les avec JSON.stringify().

Syntaxe

#
Syntaxe
new FormData()
new FormData(form)
new FormData(form, submitter)

formData.get(name)
formData.getAll(name)
formData.has(name)
formData.set(name, value)
formData.append(name, value)
formData.delete(name)

Paramètres

#
  • form

    élément <form>, optionnel

    Le formulaire dont les champs avec un attribut name seront lus.
  • submitter

    bouton, optionnel

    Le bouton qui a envoyé le formulaire. S’il a des attributs name et value, sa valeur rejoint elle aussi les données.

Plus d’exemples

#
Gérer l’envoi d’un formulaire
JavaScript
const form = document.querySelector('#feedback')

form.addEventListener('submit', (event) => {
  event.preventDefault()
  const data = new FormData(form, event.submitter)
  console.log([...data])
})

form.querySelector('button').click()
Console
[['message', 'Excellent cours !'], ['rating', '5'], ['action', 'send']]

D’un groupe de boutons radio, seule la valeur cochée est incluse. Le bouton d’envoi figure dans les données parce que nous avons transmis event.submitter comme second argument du constructeur.

Plusieurs valeurs sous le même nom
JavaScript
const data = new FormData(document.querySelector('#topics'))

console.log(data.get('topic'))
console.log(data.getAll('topic'))
console.log(Object.fromEntries(data))
Console
dom
['dom', 'api']
{ topic: 'api' }

get() ne renvoie que la première valeur, et Object.fromEntries() garde la dernière. Seule getAll() donne tous les sujets cochés.

Envoyer un fichier avec fetch()
JavaScript
const form = document.querySelector('#avatar-form')

form.addEventListener('submit', async (event) => {
  event.preventDefault()
  const data = new FormData(form)
  data.append('userId', '42')

  const response = await fetch('/api/avatar', { method: 'POST', body: data })
  console.log(await response.json())
})
Résultat
{ url: '/avatars/42.webp' }

Cet exemple nécessite un serveur, donc il ne s’exécute pas dans l’aperçu, et le résultat est un exemple de réponse d’API. Le fichier du champ <input type="file" name="avatar"> rejoint les données automatiquement, et le navigateur définit lui-même l’en-tête Content-Type.

Compatibilité des navigateurs

#

Largement disponible

Fonctionne dans tous les navigateurs modernes, y compris sur mobile. Vous pouvez l’utiliser sans crainte.

  • Chrome
  • Edge
  • Firefox
  • Safari

Bonnes pratiques

#
  • Donnez à chaque champ un attribut name. Les champs sans attribut n’atteignent jamais FormData, même s’ils ont une valeur.
  • En envoyant FormData avec fetch(), ne définissez pas l’en-tête Content-Type. Le navigateur l’ajoute lui-même, avec la frontière qui sépare les champs.
  • Pour plusieurs cases à cocher portant le même nom, utilisez getAll(). get() ne renverra que la première valeur cochée.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.