Comment inspecter FormData?

221

J'ai essayé de le console.logparcourir en utilisant for in.

Voici la référence MDN sur FormData.

Les deux tentatives sont dans ce violon .

var fd = new FormData(),
    key;

// poulate with dummy data
fd.append("key1", "alskdjflasj");
fd.append("key2", "alskdjflasj");

// does not do anything useful
console.log(fd);

// does not do anything useful   
for(key in fd) {
    console.log(key);
}

Comment puis-je inspecter les données du formulaire pour voir quelles clés ont été définies.

Penny Liu
la source
N'est-ce pas une fonctionnalité de Firefox uniquement?
Shiplu Mokaddim
1
Vous voulez faire key of fdau lieu de key in fd. Je ne sais pas encore pourquoi c'est techniquement, mais ça marche. Documentation ici .
cilphex
Donc, il n'y a pas de plugin Chrome ou Firefox pour afficher les données du formulaire sans ajouter de code à votre javascript?
natel

Réponses:

298

Méthode mise à jour:

Depuis mars 2016, les versions récentes de Chrome et Firefox prennent désormais en charge l'utilisation FormData.entries()pour inspecter FormData. Source .

// Create a test FormData object
var formData = new FormData();
formData.append('key1', 'value1');
formData.append('key2', 'value2');

// Display the key/value pairs
for (var pair of formData.entries()) {
    console.log(pair[0]+ ', ' + pair[1]); 
}

Merci à Ghost Echo et rloth de l' avoir signalé!

Ancienne réponse:

Après avoir consulté ces articles Mozilla , il semble qu'il n'y ait aucun moyen d'extraire des données d'un objet FormData. Vous ne pouvez les utiliser que pour créer FormData à envoyer via une demande AJAX.

Je viens également de trouver cette question qui dit la même chose: FormData.append ("clé", "valeur") ne fonctionne pas .

Un moyen de contourner ce problème serait de créer un dictionnaire standard, puis de le convertir en FormData:

var myFormData = {
    key1: 300,
    key2: 'hello world'
};

var fd = new FormData();
for (var key in myFormData) {
    console.log(key, myFormData[key]);
    fd.append(key, myFormData[key]);
}

Si vous souhaitez déboguer un objet FormData ordinaire, vous pouvez également l'envoyer afin de l'examiner dans la console de demande réseau:

var xhr = new XMLHttpRequest;
xhr.open('POST', '/', true);
xhr.send(fd);
Ryan Endacott
la source
Eh bien, ce serait une bonne idée, j'envelopperais FormData dans une méthode d'assistance, puis passerais le littéral objet. Enregistrez-le ensuite au cas où vous souhaiteriez le consulter ultérieurement.
2
les versions récentes de chrome et firefox fournissent désormais un itérateur:myFormData.entries()
rloth
1
Au moment d'écrire ces lignes, il n'y avait aucun moyen d'accéder à FormData. J'ai maintenant mis à jour la réponse pour refléter la nouvelle API. Merci pour le heads up rloth!
Ryan Endacott
2
Je pense qu'il est également utile de noter que vous pouvez saisir les données d'un formulaire existant à l' aide: var formData = new FormData(formElement). Si vous utilisez JQuery, vous pouvez donc le faire: var formData = new FormData($('#formElementID')[0]). Ajoutez ensuite les données selon vos besoins.
Peter Valadez
Pour itérer FormDatadans IE / Edge: stackoverflow.com/questions/37938955/…
cs_pupil
79

Réponse courte

console.log(...fd)

Réponse plus longue

Si vous souhaitez inspecter l'apparence du corps brut, vous pouvez utiliser le constructeur Response (qui fait partie de l'API fetch)

var fd = new FormData

fd.append("key1", "value1")
fd.append("key2", "value2")

new Response(fd).text().then(console.log)

Certains souhaitent suggérer d'enregistrer chaque entrée d'entrées, mais le console.logpeut également prendre plusieurs arguments.
console.log(foo, bar)
Pour prendre un nombre quelconque d'arguments, vous pouvez utiliser leapply méthode et l' appeler en tant que tel: console.log.apply(console, array).
Mais il existe une nouvelle façon ES6 d'appliquer des arguments avec l' opérateur de propagation et l'itérateur
console.log(...array) .

Sachant cela, et le fait que FormData et les deux tableaux ont une Symbol.iteratorméthode dans leur prototype, vous pouvez simplement le faire sans avoir à faire une boucle dessus, ou appeler .entries()pour obtenir la prise de l'itérateur

var fd = new FormData

fd.append("key1", "value1")
fd.append("key2", "value2")

console.log(...fd)

Interminable
la source
2
opérateur de diffusion !! Excellent et vraiment simple, affiche les données de formulaire au format Jsupon. Merci - pour la nouvelle réponse, je reçois juste [[PromiseStatus]]: "en attente"
platines
5
Ou à partir de la console Web, écrivez simplement[...fd]
Endless
hells bells - vous l'avez fait à nouveau @Endless. quelle méthode appelle-t-on en utilisant les crochets?
platines
eh bien, les crochets ne sont qu'un tableau et vous en créez un nouveau. Vous ...étalez les entrées avec from formdata pour créer le nouveau tableau avec tous les éléments, puis la console vide simplement le résultat de la dernière ligne que vous avez écrite
Endless
1
meilleure réponse ici - devrait supprimer tous les gumpf et laisser juste le 2e extrait de code - merci beaucoup
danday74
39

J'utilise la formData.entries()méthode. Je ne suis pas sûr de la prise en charge de tous les navigateurs, mais cela fonctionne bien sur Firefox.

Tiré de https://developer.mozilla.org/en-US/docs/Web/API/FormData/entries

// Create a test FormData object
var formData = new FormData();
formData.append('key1','value1');
formData.append('key2','value2');

// Display the key/value pairs
for (var pair of formData.entries())
{
 console.log(pair[0]+ ', '+ pair[1]); 
}

Il existe également formData.get()et formData.getAll()avec un support de navigateur plus large, mais ils n'affichent que les valeurs et non la clé. Voir le lien pour plus d'informations.

Écho fantôme
la source
3
Il est enfin facile de regarder dans les objets FormData! Cela a fonctionné pour moi après la mise à niveau vers Chrome 50 (publié hier, 13 avril 2016).
jbb
2
var paire de jette des erreurs pour moi. Le remplacer par in semble imprimer quelque chose au moins, mais ce n'est pas une clé ou une valeur comme les états MDN.
Johnny Welker
1
ES6:for (const pair of formData.entries()) { console.log(pair[0], pair[1]); }
2540625
for ... of est une ES6fonctionnalité qui ne fonctionnera que dans certains navigateurs. Exclusion de toute version d'IE selon MDN
Zanshin13
for of n'est pas pris en charge dans la plupart des IE. pris en charge uniquement dans IE edge
mingca
11

Dans certains cas, l'utilisation de:

for(var pair of formData.entries(){... 

est impossible.

J'ai utilisé ce code en remplacement:

var outputLog = {}, iterator = myFormData.entries(), end = false;
while(end == false) {
   var item = iterator.next();
   if(item.value!=undefined) {
       outputLog[item.value[0]] = item.value[1];
   } else if(item.done==true) {
       end = true;
   }
    }
console.log(outputLog);

Ce n'est pas un code très intelligent, mais ça marche ...

J'espère que c'est de l'aide.

Luc
la source
1
Je retournerais l'instruction if pour qu'elle vérifie d' doneabord. doneest le drapeau faisant autorité; si doneest faux ou non spécifié, alors valueest un élément valide (même s'il contient la valeur undefined). Quand doneest présent et true, la fin de la séquence a été atteinte et valuen'a même pas besoin d'être définie. Si valueest défini quand doneest true, alors valueest interprété comme la valeur de retour de l'itérateur. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Triynko
10

Lorsque je travaille sur Angular 5+ (avec TypeScript 2.4.2), j'ai essayé comme suit et cela fonctionne sauf une erreur de vérification statique mais for(var pair of formData.entries())ne fonctionne pas non plus.

formData.forEach((value,key) => {
      console.log(key+" "+value)
});

Vérifiez à Stackblitz

Gurkan Yesilyurt
la source
+ non compatible avec IE 11 (value, key) => {... Un mal de tête !
Delphine
1
agréable. veux vous donner 10 étoiles.
Abdullah Nurum
10

Méthode facile

J'ai utilisé ce code en angulaire 8

var formData = new FormData();
formData.append('key1', 'value1');
formData.append('key2', 'value2');

 formData.forEach((value,key) => {
    console.log(key+value)
     });
Asifali
la source
9

Solutions ES6 +:

Pour voir la structure des données du formulaire:

console.log([...formData])

Pour voir chaque paire clé-valeur:

for (let [key, value] of formData.entries()) {
  console.log(key, ':', value);
}
Hourra je vous aide
la source
2

Voici une fonction pour enregistrer les entrées d'un objet FormData dans la console en tant qu'objet.

export const logFormData = (formData) => {
    const entries = formData.entries();
    const result = {};
    let next;
    let pair;
    while ((next = entries.next()) && next.done === false) {
        pair = next.value;
        result[pair[0]] = pair[1];
    }
    console.log(result);
};

Doc MDN sur .entries()

Doc MDN sur .next()et.done

2540625
la source
2
  function abc(){ 
    var form = $('#form_name')[0]; 
        var formData = new FormData(form);
        for (var [key, value] of formData.entries()) { 
            console.log(key, value);
        }
        $.ajax({
            type: "POST",
            url: " ",
            data:  formData,
            contentType: false,
            cache: false,
            processData:false,
            beforeSend: function() {

            },
            success: function(data) {


            },

       });
}
turkane clairsemée
la source
+ non compatible avec IE 11 for...of... Un mal de tête !
Delphine
2

Vous devez comprendre que FormData::entries()renvoie une instance deIterator .

Prenez cet exemple de formulaire:

<form name="test" id="form-id">
    <label for="name">Name</label>
    <input name="name" id="name" type="text">
    <label for="pass">Password</label>
    <input name="pass" id="pass" type="text">
</form>

et cette boucle JS:

<script>
    var it = new FormData( document.getElementById('form-id') ).entries();
    var current = {};
    while ( ! current.done ) {
        current = it.next();
        console.info( current )
    }
</script>
kaiser
la source
2

Dans angular 7, j'ai obtenu des entrées sur la console en utilisant la ligne de code ci-dessous.

formData.forEach(entries => console.log(entries));
Yousuf
la source
2

Déjà répondu, mais si vous souhaitez récupérer facilement des valeurs à partir d'un formulaire soumis, vous pouvez utiliser l'opérateur de diffusion combiné à la création d'une nouvelle carte itérable pour obtenir une belle structure.

new Map([...new FormData(form)])

ngr
la source
bien - cela a un problème avec inp_nam [some_mult] [] - seul le dernier est vu
halfbit
2

dans typeScriptde angular 6, ce code fonctionne pour moi.

var formData = new FormData();
formData.append('name', 'value1');
formData.append('name', 'value2');
console.log(formData.get('name')); // this is return first element value.

ou pour toutes les valeurs:

console.log(formData.getAll('name')); // return all values
AminRostami
la source
1

Essayez cette fonction:

function formDataToObject(formData) {
  return Array.from(formData.entries()).reduce((old, pair) => ({
    ...old,
    [pair[0]]: pair[1],
  }), {});
}
Mauro
la source
2
Bien que cet extrait de code puisse être la solution, y compris une explication aide vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondrez à la question pour les lecteurs à l'avenir, et ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.
Johan
0

Le MDN propose la forme suivante:

let formData = new FormData();
formData.append('name', 'Alex Johnson')
for(let keyValuePair of formData.entries()){
    console.log(keyValuePair); //has form ['name','Alex Johnson']
}

Alternativement

for (let [key, value] of formData.entries()) {
 console.log(key, ':', value);
}

Envisagez d'ajouter ES + Polyfills , au cas où le navigateur ou l'environnement ne prend pas en charge les dernières API JavaScript et FormData.

J'espère que ça aide.

Manioz
la source
Avez-vous testé ce code avant de l'exécuter? formData()devrait être capitalisé, premièrement. En outre, votre for ... of loopligne 3 appelle implicitement FormData.entries, vous pouvez le voir en exécutant new FormData()[Symbol.iterator]dans la console. Enfin, si vous l'exécutez dans des navigateurs comme Edge, qui ne prennent pas en charge FormData.entries, vous obtenez des résultats inattendus, tels que l'impression des noms de méthode disponibles sur l'objet FormData:>>> var data = new FormData(); data.append("Foo", "Bar"); for(let x in data){console.log(x)}; <<< 'append'
Lovethenakedgun